由于/ d1clr:nostdlib导致无法解释的MSBuild错误

时间:2011-09-13 15:21:20

标签: visual-studio-2010 msbuild c++-cli

仍然不太了解.NET,我的任务是将一个相当大的.NET解决方案从VS2008转换为VS2010。其中一部分是一组C ++项目(/clr),我将其迁移到VS2010。我将目标框架设置为2.0,因为它们用于不立即转换的项目中。

在经历了很多麻烦之后,我就在整个解决方案在VS2010中构建,但是对于自动构建和测试,我需要使用MSBuild构建这个东西,并且失败了。问题是/d1clr:nostdlib开关附加到编译器命令行的某处,导致一个令人讨厌的错误消息:
error MSB6001: Invalid command line switch for "CL.exe". Illegal characters in path. [C:\blah\foo.vcxproj]
当我查看MSBuild发出的命令行时,我看到的唯一奇怪的事情是它以所述开关结束:...foo.cpp bar.cpp baz.cpp /d1clr:nostdlib

  1. 我认为这个开关失败了,因为为.NET 2.0调用的旧编译器不知道如何处理它?
  2. 我将从哪里开始寻找附加此开关的位置?我没有在项目的属性页的C / C ++ /命令行选项中看到它。

1 个答案:

答案 0 :(得分:3)

您确定需要将目标框架设置为2.0吗?

2.0项目不能引用4.0项目(或转换后的项目是什么)?

从戳MSBuild文件开始,由于Microsoft.CppBuild.targets中的这些行(在我的机器上,位于C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0下面),似乎添加了命令:

  <ClCompile Condition="'@(ClCompile)' != '' and '$(CLRSupport)' != 'false' and '$(CLRSupport)' != ''">
    <AdditionalUsingDirectories>$(TargetFrameworkDirectory);%(ClCompile.AdditionalUsingDirectories)</AdditionalUsingDirectories>
    <AdditionalOptions Condition="('$(TargetFrameworkVersion)' == 'v3.5' or '$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v2.0')">/d1clr:nostdlib %(ClCompile.AdditionalOptions)</AdditionalOptions>
    <AdditionalOptions Condition="'$(TargetFrameworkVersion)' == 'v4.0'">/clr:nostdlib %(ClCompile.AdditionalOptions)</AdditionalOptions>
  </ClCompile>

换句话说,添加它只是因为您将目标框架版本设置为4.0以外的版本。 (如果已将其设置为4.0,则会添加/clr:nostdlib标志)

我不知道为什么直接通过MSBuild调用它时不起作用。也许它使用不同的编译器版本(PATH或其他一些未正确设置的环境变量?)

通过Visual Studio构建时,它也会调用MSBuild,所以实际上,除非您的某些环境设置不同,否则“直接”调用MSBuild应该没有任何区别。 (或者你用错误的标志调用MSBuild)

当然,对于这些MSBuild文件没什么“神奇”的,所以你可以修改它们,或者编辑你的项目来引用它们的不同版本(你已修改为不插入标志)。如果忽略XML混乱,那就是一个通用的构建系统。除了这些XML文件中指定的内容之外,它对VC ++项目没有任何“内置”理解。

相关问题