在命令行中向 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 和元数据。
而PreprocessorDefinitions
是ClCompile
项的元数据。
解决方案是您应该将 msbuild 属性 插入 PreprocessorDefinitions
以从命令行传输值。
这样添加:
<PropertyGroup>
<POValue></POValue>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
....
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)$(POValue)</PreprocessorDefinitions>
....
</ClCompile>
....
</ItemDefinitionGroup>
这是针对 Debug|Win32
的,您可以像这样为每个 Configuration 和 Platform.[=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
我需要在不使用 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 和元数据。
而PreprocessorDefinitions
是ClCompile
项的元数据。
解决方案是您应该将 msbuild 属性 插入 PreprocessorDefinitions
以从命令行传输值。
这样添加:
<PropertyGroup>
<POValue></POValue>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
....
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)$(POValue)</PreprocessorDefinitions>
....
</ClCompile>
....
</ItemDefinitionGroup>
这是针对 Debug|Win32
的,您可以像这样为每个 Configuration 和 Platform.[=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