在命令行中向 CL 添加预处理器并通过 MSBuild 构建 *.sln

Adding preprocessor to CL in command line and build *.sln by MSBuild

我需要在不使用 vs2019 的情况下使用 MSBiuld 在命令行中编译和构建 c++ 项目 IDE,必须通过命令行添加一些预处理器!

例如,如何定义PO预处理器和运行MSBuild来编译下面的代码?

#include <iostream>

using namespace std;

int main()
{
#ifdef PO
    cout << "PO is defined";
#else
    cout << "PO not defined";
#endif
    
    return 0;
}

您可以使用 CL environment variables to set the /D option.

例如定义PO,你可以做

SET CL=/DPO

调用 MSBuild 之前的命令行。

请务必阅读这些文档,因为如果要定义预处理器,您可能需要使用井号 (#) 而不是等号 (=)具有显式值的常量。此外(取决于上下文)如果要定义字符串常量,引号 (") 可能需要转义(如 \")。

实际上,MSBuild 命令行只能传输 msbuild properties into it rather than msbuild items 和元数据。

PreprocessorDefinitionsClCompile项的元数据。

解决方案是您应该将 msbuild 属性 插入 PreprocessorDefinitions 以从命令行传输值。

这样添加:

<PropertyGroup>
        <POValue></POValue>
    </PropertyGroup>
    
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
     ....
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)$(POValue)</PreprocessorDefinitions>
     ....
    </ClCompile>

  ....

</ItemDefinitionGroup>

这是针对 Debug|Win32 的,您可以像这样为每个 ConfigurationPlatform.[=22= 添加]

然后,可以使用msbuild xxx\xxx.vcxproj -p:POValue=PO命令行在PO预处理器下构建。

如果你不想PO,只需要在命令行加上-p:POValue=PO即可。

如果你有其他预处理器,你可以这样修改PreprocessorDefinitions

<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)$(POValue);$(OnePreprocessor);$(TwoPreprocessor)</PreprocessorDefinitions>

基于CL environment variables,任何先行者都可以由/D定义 例如

set CL=/DPO
MSBuild project.sln

要确保在不重新启动 cmd 或命令行工具的情况下应用前任的最后定义,请使用 /t:Clean;Rebuild

set CL=/DPO
MSBuild Project1.sln /t:Clean;Rebuild