【问题标题】:Define a preprocessor value from command line using MSBuild [duplicate]使用 MSBuild 从命令行定义预处理器值
【发布时间】:2010-10-03 20:51:57
【问题描述】:

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

#if DEMO
    mycode.NeuterNow();
#endif

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

MSBuild -DefineProperty:DEMO MySolution.sln

这样的功能存在吗?

【问题讨论】:

    标签: c# compiler-construction msbuild c-preprocessor


    【解决方案1】:

    试试

    msbuild /p:DefineConstants=DEBUG;DEMO MySolution.sln
    

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

    【讨论】:

    • /p:DefineConstants=DEMO 第二个“:”需要是一个“="
    【解决方案2】:

    That's a duplicate of this one,是的,/p:DefineConstants 确实可以正常工作,并且配置器是正确的,这将覆盖项目文件中已经定义的所有条件符号(恕我直言),所以你必须定义它们全部。

    【讨论】:

    • 有什么办法不覆盖吗?
    【解决方案3】:

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

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

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

    MSBuild solution.sln /p:FeatureSet=DEMO
    

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

    我已在 VS2010 中验证了此功能。不太确定如何为在没有 MSBuild 的 Visual Studio 中完成的构建定义 FeatureSet。

    【讨论】:

    • 你能给我一个完整的例子吗?我无法弄清楚如何准确地做到这一点......
    • 再一次,这只是VS2010。我不知道以后的版本。预处理器指令是项目属性中以分号分隔的项目列表,位于配置 - C++ - 预处理器下。手动将 $(Variable) 添加到列表中,然后当您从命令行调用 MSBuild 时,您可以设置 /p:Variable=FOO 并且像 #ifdef FOO 这样的东西会响应它。
    • 当 /p:DefineConstants 不适合我时,我确认它适用于 VS2017。我在调用 MSBuild.exe 时输入了$(MyDefines) 并使用了/p:MyDefines="DEMO;NO_OPENCL"。现在我想起来了,我的 .vcxproj 中没有看到任何名为“DefineConstants”的东西,也许这就是它不起作用的原因。
    • @MichelRouzic 您的解决方案是否有 1 个项目或多个项目?如果有多个项目,我似乎无法让它工作。相反,我认为出于某种原因 VS 认为 $(Var) 是一个不会扩展到任何东西的环境变量
    • 只有一个项目,我不知道如何修复不止一个。
    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多