提问人:sbi 提问时间:9/13/2011 更新时间:9/14/2011 访问量:1804
由于 /d1clr:nostdlib 而出现莫名其妙的 MSBuild 错误
Getting inexplicable MSBuild errors due to /d1clr:nostdlib
问:
我仍然不太了解 .NET,我的任务是将一个相当大的 .NET 解决方案从 VS2008 转换为 VS2010。其中一部分是一组C++项目(),我将其迁移到VS2010。我将他们的目标框架设置为 2.0,因为它们用于现在不转换的项目。/clr
经过一番麻烦,我现在已经到了在 VS2010 中构建整个解决方案的地步,但是对于自动化构建和测试,我也需要使用 MSBuild 构建它,但失败了。问题是开关的某个地方被附加到编译器命令行,导致一个令人讨厌的错误消息: 当我查看 MSBuild 发出的命令行时,我看到的唯一奇怪的事情是它以所述开关结尾:
/d1clr:nostdlib
error MSB6001: Invalid command line switch for "CL.exe". Illegal characters in path. [C:\blah\foo.vcxproj]
...foo.cpp bar.cpp baz.cpp /d1clr:nostdlib
- 我想这个开关失败了,因为为 .NET 2.0 的东西调用的旧编译器不知道如何处理它?
- 我应该从哪里开始寻找此开关的附加位置?我在项目的属性页的 C/C++/命令行选项上看不到它。
答:
是否确实需要将目标框架设置为 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++ 项目没有任何“内置”理解。
评论
"/property:FrameworkDir=%FrameworkDir%"
评论