由于 /d1clr:nostdlib 而出现莫名其妙的 MSBuild 错误

Getting inexplicable MSBuild errors due to /d1clr:nostdlib

提问人:sbi 提问时间:9/13/2011 更新时间:9/14/2011 访问量:1804

问:

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

经过一番麻烦,我现在已经到了在 VS2010 中构建整个解决方案的地步,但是对于自动化构建和测试,我也需要使用 MSBuild 构建它,但失败了。问题是开关的某个地方被附加到编译器命令行,导致一个令人讨厌的错误消息: 当我查看 MSBuild 发出的命令行时,我看到的唯一奇怪的事情是它以所述开关结尾:

/d1clr:nostdliberror MSB6001: Invalid command line switch for "CL.exe". Illegal characters in path. [C:\blah\foo.vcxproj]...foo.cpp bar.cpp baz.cpp /d1clr:nostdlib

  1. 我想这个开关失败了,因为为 .NET 2.0 的东西调用的旧编译器不知道如何处理它?
  2. 我应该从哪里开始寻找此开关的附加位置?我在项目的属性页的 C/C++/命令行选项上看不到它。
可视化工作室 2010 msbuild c++-cli

评论

0赞 R. Martinho Fernandes 9/13/2011
你提到了 .NET 2.0 上剩余的 C++ 项目。是所有项目都面向 2.0,还是只面向 C++?
0赞 sbi 9/14/2011
@RMartinho:几个共享的项目必须继续以2.0为目标。所有 C++ 项目都在其中。

答:

3赞 jalf 9/14/2011 #1

是否确实需要将目标框架设置为 2.0?

2.0 项目不能引用 4.0 项目(或转换后的任何项目)吗?

通过浏览 MSBuild 文件,该命令似乎是由于以下行而添加的(在我的机器上,位于:Microsoft.CppBuild.targetsC:\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++ 项目没有任何“内置”理解。

评论

0赞 sbi 9/14/2011
我不确定我们是否需要 2.0 目标,但由于 TPTB 是,这没有意义。我不知道你写的其余部分,但我会进一步深入研究并报告。
0赞 sbi 9/14/2011
该死的,你关于MSBuild可能被调用的有趣标志的提示是正确的。由于我无法理解的原因(并隐藏在某些生成脚本中),有一个参数传递给了 MSBuild。删除它解决了问题。多谢!"/property:FrameworkDir=%FrameworkDir%"