我试图使用MSBuild自动编译各种开放源码项目。
我想在编译管道中添加一个自定义CL.exe标志:将调用约定设置为fastcall (在cl.exe中,这是作为/Gr传递的)。这意味着默认的cdecl选项(/Gd)需要被覆盖。
我尝试设置一个MSBuild属性,但这没有起作用:
MSBuild.exe /p:PlatformToolset=v141 /p:Platform=x64 /p:Configuration=Release /p:CallingConvention=/Gr
我还想用几个其他标志来做这件事,这样就不会孤立于调用约定。我也希望在不编辑任何配置文件的情况下这样做,只使用CLI。
我怎样才能用MSBuild做到这一点呢?
谢谢!
发布于 2020-02-10 10:28:09
我尝试设置一个MSBuild属性,但这没有起作用。我怎样才能用MSBuild做到这一点呢?
请参阅msbuild 全局性质,命令行只接收msbuild属性,而CallingConvention不是msbuild属性。
我创建了一个C++项目,并在Debug/X86配置中更改了C/C++=>Advanced中的/Gd to /Gr,然后我看到如下所示:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
...
<CallingConvention>FastCall</CallingConvention>
</ClCompile>
<Link>
...
</Link>
</ItemDefinitionGroup>很明显,CallingConvention只是Item CLCompile的一个Metadata。这不是msbuild属性。所以我们不能像这样在msbuild命令行中设置它:msbuild /p:xxx。
可能的解决办法
由于使用/Gr和/Gd的唯一区别是元数据行:

因此,我认为我们可以在项目文件中复制一个ItemDefinitionGroup,并设置它们的条件如下:
<!--ItemDefinitionGroup when using default /Gd-->
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' == ''">
<ClCompile>
...
</ClCompile>
...
</ItemDefinitionGroup>
<!--ItemDefinitionGroup when using /Gr-->
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' != ''">
<ClCompile>
...
<CallingConvention>FastCall</CallingConvention> <!--The only difference here.-->
</ClCompile>
...
</ItemDefinitionGroup>然后,如果我们将值传递给自定义属性UseFastCall:MSBuild.exe /p:PlatformToolset=v141 /p:Platform=x86 /p:Configuration=Debug /p:UseFastCall=true。它应该使用/Gr元数据。如果我们不将值传递给该属性,它将使用defaut /Gd。因此,解决办法是创建自定义属性来控制该行为。(它只适用于Debug\win32 32,您可能还需要对其他配置进行编辑。)
https://stackoverflow.com/questions/60138514
复制相似问题