跳转至主内容

 none
如何在命令行中用 msbuild 添加条件编译 c++ 工程 vcxproj ? RRS feed

  • 问题

  • 网上找了2天,找到命令行参数只对 c# 工程有效,无法作用在 c++ 工程,有哪位大佬可以指点一二吗?

    c# 命令行参数:/p:DefineConstants=CONDITION

    网上提到的均无效,如下:

    /p:DefaultConstant=CONDITION

    /p:PreprocessorDefinitions=CONDITION


    2019年9月29日 6:31

答案

  • 你好,

    欢迎来到MSDN论坛。

    >>网上找了2天,找到命令行参数只对 c# 工程有效,无法作用在 c++ 工程

    据我所知,msbuild的命令行参数是可以作用于C++的项目文件的(vcxproj)。例如:

    /p:Platform=x64可以控制生成面向x64的应用, 而/p:OutDir=$(SolutionDir)MyTest可以控制生成应用或者dll的路径在解决方案目录下的MyTest文件夹。

    如果可以的话,请分享更多的细节来帮助我们理解您想通过命令行参数做到哪种编译的效果。

    >>网上提到的均无效,如下:/p:DefaultConstant=CONDITION  /p:PreprocessorDefinitions=CONDITION

    "/p"其实代表"/property", 是项目文件(vcxproj)的一个MSBuild属性, 我们可以这样理解:当我们用 msbuild xxx.vcxproj /p:Configuration=Debug 在命令行生成(build) C++项目的时候, 实际上msbuild这个VS的build引擎会去读取项目文件的内容,并且按照一定的逻辑去编译,去构建生成整个项目应用。而property(属性)正是项目文件的内容之一。

    当我们用记事本打开vcxproj可以看到里面是这样定义C++编译文件相关的属性的:

    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <ClCompile>
          <PrecompiledHeader>Use</PrecompiledHeader>
          <WarningLevel>Level3</WarningLevel>
          <Optimization>Disabled</Optimization>
          <SDLCheck>true</SDLCheck>
          <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
          <ConformanceMode>true</ConformanceMode>
          <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
        </ClCompile>
        <Link>
          <SubSystem>Console</SubSystem>
          <GenerateDebugInformation>true</GenerateDebugInformation>
        </Link>
      </ItemDefinitionGroup>

    据上面分享的文档可以发现, property属性是定义在PropertyGroup里的,然而从上面的脚本可以发现这个PreprocessorDefinitions并不是一个属性,他并没有定义在PropertyGroup, 所以我们无法通过 /p:PreprocessorDefinitions=xxx 这种全局属性的方法来定义或者覆盖他的值。

    此外:不同版本的VS可能有不同的定义vcxproj的方式,据我测试, 对于VS2017和VS2019中的C++项目,PreprocessorDefinitions都不是一个属性, 而只是一个项元数据,这也是为什么您用的命令都不起作用。

    我们可以在命令行参数中来控制C++的编译和构建行为,但是有一点需要明确,msbuild命令行参数必须是个属性才能起作用。

    希望以上的信息可以对解决您的疑问有帮助。期待您的反馈!

    Best Regards

    Lance


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2019年10月1日 3:49

全部回复

  • 你好,

    欢迎来到MSDN论坛。

    >>网上找了2天,找到命令行参数只对 c# 工程有效,无法作用在 c++ 工程

    据我所知,msbuild的命令行参数是可以作用于C++的项目文件的(vcxproj)。例如:

    /p:Platform=x64可以控制生成面向x64的应用, 而/p:OutDir=$(SolutionDir)MyTest可以控制生成应用或者dll的路径在解决方案目录下的MyTest文件夹。

    如果可以的话,请分享更多的细节来帮助我们理解您想通过命令行参数做到哪种编译的效果。

    >>网上提到的均无效,如下:/p:DefaultConstant=CONDITION  /p:PreprocessorDefinitions=CONDITION

    "/p"其实代表"/property", 是项目文件(vcxproj)的一个MSBuild属性, 我们可以这样理解:当我们用 msbuild xxx.vcxproj /p:Configuration=Debug 在命令行生成(build) C++项目的时候, 实际上msbuild这个VS的build引擎会去读取项目文件的内容,并且按照一定的逻辑去编译,去构建生成整个项目应用。而property(属性)正是项目文件的内容之一。

    当我们用记事本打开vcxproj可以看到里面是这样定义C++编译文件相关的属性的:

    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <ClCompile>
          <PrecompiledHeader>Use</PrecompiledHeader>
          <WarningLevel>Level3</WarningLevel>
          <Optimization>Disabled</Optimization>
          <SDLCheck>true</SDLCheck>
          <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
          <ConformanceMode>true</ConformanceMode>
          <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
        </ClCompile>
        <Link>
          <SubSystem>Console</SubSystem>
          <GenerateDebugInformation>true</GenerateDebugInformation>
        </Link>
      </ItemDefinitionGroup>

    据上面分享的文档可以发现, property属性是定义在PropertyGroup里的,然而从上面的脚本可以发现这个PreprocessorDefinitions并不是一个属性,他并没有定义在PropertyGroup, 所以我们无法通过 /p:PreprocessorDefinitions=xxx 这种全局属性的方法来定义或者覆盖他的值。

    此外:不同版本的VS可能有不同的定义vcxproj的方式,据我测试, 对于VS2017和VS2019中的C++项目,PreprocessorDefinitions都不是一个属性, 而只是一个项元数据,这也是为什么您用的命令都不起作用。

    我们可以在命令行参数中来控制C++的编译和构建行为,但是有一点需要明确,msbuild命令行参数必须是个属性才能起作用。

    希望以上的信息可以对解决您的疑问有帮助。期待您的反馈!

    Best Regards

    Lance


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2019年10月1日 3:49
  • 你好,

    后来查找到了一点相关知识,msbuild 好像并不会解析 c++ 项目,只解析编译 c# 和 vb.net,具体哪里看到的忘了,只记得是微软官方文档。

    觉得不支持设定附加编译条件,真的不完美。

    祝好!

    2019年10月4日 5:40