2011-09-13 31 views
0

仍然不太瞭解.NET,我的任務是將相當大的.NET解決方案從VS2008轉換爲VS2010。其中一部分是一組C++項目(/clr),我遷移到了VS2010。我將他們的目標框架設置爲2.0,因爲它們用於目前不能轉換的項目。由於/ d1clr導致莫名其妙的MSBuild錯誤:nostdlib

經過很多麻煩我在整個解決方案在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++/Command Line選項中看到它。
+0

您提到了.NET 2.0中剩餘的C++項目。所有項目的目標是2.0,還是僅僅是C++的? –

+0

@RMartinho:共享的幾個項目將不得不繼續瞄準2.0。所有的C++項目都是其中之一。 – sbi

回答

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混亂,那只是一個通用的構建系統。它沒有任何「內置」的VC++項目理解,超出了這些XML文件中指定的內容。

+0

我不確定我們需要2.0的目標,但自TPTB以來,這是沒有意義的。我不知道你寫的內容的其餘部分,但我會深入研究並報告。 – sbi

+0

該死的,你有關滑稽標誌MSBuild的提示可能會被調用,當場是正確的。由於我無法理解的原因(並且隱藏在某個構建腳本中),有一個傳遞給MSBuild的「/ property:FrameworkDir =%FrameworkDir%」參數。刪除,解決了這個問題。非常感謝! – sbi