使用MSBuild从命令行定义预处理器值

Bri*_*anH 19 c# compiler-construction msbuild c-preprocessor

我需要创建一个包含多个项目的现有大型应用程序的演示版本.我想使用现有项目,并通过预处理器指令中性化功能

#if DEMO
    mycode.NeuterNow();
#endif
Run Code Online (Sandbox Code Playgroud)

我们正在使用MSBuild构建我们的应用程序,我理想地使用以下内容:

MSBuild -DefineProperty:DEMO MySolution.sln
Run Code Online (Sandbox Code Playgroud)

这样的功能是否存在?

con*_*tor 14

尝试

msbuild /p:DefineConstants=DEBUG;DEMO MySolution.sln
Run Code Online (Sandbox Code Playgroud)

您必须包含DEBUG或RELEASE以及已在解决方案文件中定义的任何其他常量,但我认为这应该有效.免责声明:我自己从未尝试过.


Mic*_*tum 9

这是一个副本,是的,/ p:DefineConstants工作正常,配置器是正确的,这将覆盖已经在项目文件中定义的所有条件符号(这是很好的恕我直言),所以你必须定义它们所有.

  • 有什么办法不覆盖吗? (2认同)

Gla*_*ius 5

在寻求自己解决这个问题的方法时,我发现了一些有趣的事情,我想我会分享。

MSBuild 中的 /p 指令不限于构建文件中已存在的属性。你可以用它来设置任何东西。

因此,例如,如果您使用 $(FeatureSet) 引导预处理器指令,然后调用 MSBuild,例如

MSBuild solution.sln /p:FeatureSet=DEMO
Run Code Online (Sandbox Code Playgroud)

它相应地获得#defined,而无需手动破坏并重新指定您正在运行的任何其他预处理器指令。

我已经验证了这在 VS2010 中有效。不太确定如何为没有 MSBuild 的 Visual Studio 内部完成的构建定义 FeatureSet。

  • 你能给我一个完整的例子吗?我无法弄清楚如何准确地做到这一点...... (2认同)
  • 再次强调,这只是 VS2010。我不知道以后的版本。预处理器指令是项目属性中以分号分隔的项目列表,位于配置 - C++ - 预处理器下。手动将 $(Variable) 添加到列表中,然后当您从命令行调用 MSBuild 时,您可以设置 /p:Variable=FOO ,诸如 #ifdef FOO 之类的内容将对其做出响应。 (2认同)