仍然不太了解.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
答案 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 ++项目没有任何“内置”理解。