Visual studio 2010 由于/d1clr:nostdlib而获取无法解释的MSBuild错误

Visual studio 2010 由于/d1clr:nostdlib而获取无法解释的MSBuild错误,visual-studio-2010,msbuild,c++-cli,Visual Studio 2010,Msbuild,C++ Cli,我仍然不太了解.NET,我的任务是将一个相当大的.NET解决方案从VS2008转换到VS2010。它的一部分是C++项目( CLR),我迁移到VS2010。我将它们的目标框架设置为2.0,因为它们用于现在不需要转换的项目中 在经历了很多麻烦之后,我已经到了在VS2010中构建整个解决方案的地步,但是对于自动化构建和测试,我也需要使用MSBuild构建这个东西,但这失败了。问题在于,/d1clr:nostdlib开关被附加到编译器命令行的某个地方,导致一条严重的错误消息: 错误MSB6001:“C

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

在经历了很多麻烦之后,我已经到了在VS2010中构建整个解决方案的地步,但是对于自动化构建和测试,我也需要使用MSBuild构建这个东西,但这失败了。问题在于,
/d1clr:nostdlib
开关被附加到编译器命令行的某个地方,导致一条严重的错误消息:
错误MSB6001:“CL.exe”的命令行开关无效。路径中存在非法字符。[C:\blah\foo.vcxproj]

当我查看MSBuild发出的命令行时,我看到的唯一奇怪的事情是它以所述开关结尾:
…foo.cpp bar.cpp baz.cpp/d1clr:nostdlib

  • 我想这个开关失败是因为为.NET2.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>
    
    
    $(TargetFrameworkDirectory);%(ClCompile.AdditionalUsingDirectory)
    /d1clr:nostdlib%(ClCompile.AdditionalOptions)
    /clr:nostlib%(ClCompile.AdditionalOptions)
    
    换句话说,添加它只是因为您将目标框架版本设置为4.0以外的版本(如果设置为4.0,则会添加
    /clr:nostdlib
    标志)

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

    当通过Visual Studio进行构建时,它还调用MSBuild,因此实际上,除非环境的某些部分设置不同,否则“直接”调用MSBuild不会有任何区别。(或者使用错误的标志调用MSBuild)


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

    您确定需要将目标框架设置为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>
    
    
    $(TargetFrameworkDirectory);%(ClCompile.AdditionalUsingDirectory)
    /d1clr:nostdlib%(ClCompile.AdditionalOptions)
    /clr:nostlib%(ClCompile.AdditionalOptions)
    
    换句话说,添加它只是因为您将目标框架版本设置为4.0以外的版本(如果设置为4.0,则会添加
    /clr:nostdlib
    标志)

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

    当通过Visual Studio进行构建时,它还调用MSBuild,因此实际上,除非环境的某些部分设置不同,否则“直接”调用MSBuild不会有任何区别。(或者使用错误的标志调用MSBuild)


    当然,这些MSBuild文件并没有什么“神奇”之处,所以您可以修改它们,或者编辑项目以引用它们的不同版本(您已修改为不插入标志)。如果忽略XML混乱,它只是一个通用的生成系统。它没有任何“内置”功能了解VC++项目,超出了这些XML文件中指定的内容。

    你提到了.NET 2上的C++项目。所有项目都是2,还是C++的?@ RMARTIOHO:共享的几个项目必须保持2的目标。所有C++项目都在其中。你提到了.NET 2上的C++项目。0、所有项目都是2的,还是只是C++的?@ RMARTIOHO:有几个项目是共享的,必须保持2的目标。所有C++项目都在其中。我不确定我们需要2个目标,但是TPTB是这样的,我不知道你写的其余部分,但是我会进一步深入研究并报告。关于调用MSBuild时可能使用的有趣标志的提示是正确的。由于我无法理解(并且隐藏在某些生成脚本中)的原因,存在一个
    “/property:FrameworkDir=%FrameworkDir%”
    传递给MSBuild的参数。删除该参数修复了问题。非常感谢!我不确定我们是否需要2.0目标,但由于TPTB是,这是没有意义的。我不知道您编写的其他内容,但我会深入研究并报告。该死,您关于MSBuild可能使用的有趣标志的提示是正确的。出于我可以理解的原因无法理解(隐藏在某些生成脚本中),有一个
    “/property:FrameworkDir=%FrameworkDir%”参数传递给了MSBuild。删除该参数修复了问题。非常感谢!