代码之家  ›  专栏  ›  技术社区  ›  Tim

是否可以在sln文件中而不是在项目中设置预处理器宏?(VS2008 c++)

  •  4
  • Tim  · 技术社区  · 15 年前

    我正在维护一个大型代码库,一些vcproj文件用于不同的解决方案。由于一些可怕的配置和依赖性,处理一些构建问题的最佳方法似乎是#ifdef代码,但为了做到这一点,我需要在解决方案文件级别而不是vcproj级别设置预处理器定义。

    可能吗?

    怎么做?

    6 回复  |  直到 15 年前
        1
  •  5
  •   Daryl Hanson    15 年前

    我相信你可能想做的是用VS创建一个项目属性表 Project Manager 所有的项目都可以继承。这将允许您在单个位置设置任何公共项目设置,包括预处理器宏,并根据需要继承它们。

        2
  •  4
  •   Hans Passant    15 年前

    选择解决方案中的所有项目。项目+属性,C/C++,预处理器,预处理器定义。添加

    /DSOLUTION=$(SolutionName)
    

    现在可以在源代码中测试解决方案宏值。

        3
  •  4
  •   Jan    10 年前

    我终于找到了适合我的东西

    在我的“C:\Users\\AppData\Local\Microsoft\MSBuild\v4.0”中

    我把它改了一点:

    <?xml version="1.0" encoding="utf-8"?> 
    <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="$(SolutionDir)\$(SolutionName).props"  Condition="Exists('$(SolutionDir)\$(SolutionName).props')"/>      
    </Project>
    

    所以现在,如果在“mysolution.sln”旁边有一个“mysolution.props”,那么我就得到了整个解决方案的属性表,而不需要更改项目内部的任何内容。它成为我的视觉环境的一个新特性

        4
  •  1
  •   Thomas daign    15 年前

    2008年的sln真的很蠢,它们只有要放入解决方案资源管理器的项目/文件列表和项目依赖项,所以我认为这不是一个选项。

    我的直觉是用相对路径做一些事情。例如,在stdafx中。h可以#包括“…\project_configuration.h”,然后为了构建sln a,您可以向一个目录和另一个目录检查内容。每个项目都有各自的项目配置。H

    我相信你可以用vsprops文件做一些类似的事情,它们基本上是vcproj文件的#includes,尽管我发现随着时间的推移,它们的维护有点烦人。

        5
  •  1
  •   Jan    10 年前

    另一种方法:

    用这样的东西编辑你的vcxproj(或你的vcxproj.user)

    <PreprocessorDefinitions Condition="'$(SolutionName)'=='NameOfYourSolution'">
        YOUR_DEFINITION;%(PreprocessorDefinitions)
    </PreprocessorDefinitions>
    

    它并不完美,因为它取决于你的sln文件名。 如果我们改用$(SolutionConfiguration)变量就好了。

    不幸的是,我只看到项目配置的变量:$(配置)。

    不管怎么说,它确实起到了作用。。。

        6
  •  0
  •   Community Mohan Dere    8 年前

    我也看过

    Define a preprocessor value from command line using MSBuild

    msbuild, defining Conditional Compilation Symbols

    这些可能也会起作用,但是我们的构建系统现在非常脆弱,我无法完全改变它。

    我提出的解决方案是在一个解决方案中克隆项目的构建配置,并给它一个不同的名称。然后我在新配置中添加了宏/预处理器定义。

    它似乎按预期工作。因此,一个解决方案使用旧的“release”配置,另一个解决方案使用具有不同预处理器def的克隆“releasesspecial”(不是我真正使用的名称)配置。

    虽然不理想,但它确实有效。

    如果propoerties更容易处理,或者SLN文件可以传入预处理器def,那就太好了。