2012-09-19 42 views
9

我正在嘗試使用cmake設置C++/CLI項目。我已經成功與Visual Studio 2010中這樣做,但現在我有需要的Visual Studio 2008在Visual Studio 2010的傳統解決方案的工作,就足以建立我的CMake是這樣的:C++/CLI和CMake

set_target_properties(${PROJECT_NAME} PROPERTIES VS_DOTNET_REFERENCES "${CMAKE_CURRENT_SOURCE_DIR}/../OrionMaster/3rdParty/GMap.NET.Core.dll;System;System.Core;System.Data;System.Drawing;System.Xml;WindowsBase") 
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/clr /EHa") 
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d") 

if(CMAKE_CXX_FLAGS_DEBUG MATCHES "/RTC1") 
    string(REPLACE "/RTC1" " " CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") 
endif() 

if(CMAKE_CXX_FLAGS MATCHES "/EHsc") 
    string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 
endif() 

當然後,我在Visual Studio 2010下檢查該項目,我可以看到所有參考和「公共語言運行時支持」已打開。當我在visual studio 2008中嘗試它時,我沒有看到任何引用,並且項目設置爲「No Common Language Runtime Support」如果我然後查看編譯器選項,可以看到/ clr正在傳遞給編譯器。但是我仍然遇到很多編譯錯誤,可能是因爲它缺少引用。有誰知道一種方法來正確設置它?

+0

你有沒有想過這個?我遇到了同樣的問題(無法在VS 2008中設置CLR標誌)。 – Kohanz

+1

不,我們放棄了,它似乎在vs 2008中被破解,讓我知道如果你想出點什麼 –

+0

我發現設置/ CLR標誌確實有效。 VS2008屬性頁不會選擇此選項,但該DLL確實編譯爲/ clr。 – Kohanz

回答

6

對VS_DOTNET_REFERENCES屬性的唯一「真實」源代碼引用位於CMake源文件Source/cmVisualStudio10TargetGenerator.cxx中。

這是什麼意思在實踐中:VS_DOTNET_REFERENCES只適用於Visual Studio 2010的CMake生成器和任何從它繼承的生成器。 (現在在VS 2012和2013的最新CMake版本中存在...)

修改CMake源代碼以支持早期版本的Visual Studio的該屬性可能是可能的,但它尚未完成這點。

1

正如@DLRdave所指出的,CMake只對Visual Studio 2010生成器執行此操作。

嘗試這種解決方法,而不是VS_DOTNET_REFERENCES其他發電機:

# Note that /FU and ${asmPath} must not be separated by a space, else CMake 
# will remove duplicate "/FU" options. 
target_compile_options(target PRIVATE "/FU${asmPath}") 

對於系統組件一樣System.dllPresentationCore.dll,等你應該通過asmPath提供編譯器一個完整的絕對路徑。您需要使用參考程序集,而不是未安裝在計算機上的程序集。舉個例子,對於3.5在Visual Studio 2008中的目標框架,你需要尋找這些目錄中的引用文件,其順序是:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5 
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0 
C:\Windows\Microsoft.NET\Framework\v2.0.50727 

你會注意到,如果你使用的MSBuild來建立一個標準的C#或C++/CLI項目,你會發現它也將絕對路徑傳遞給上述位置的文件(嘗試檢查構建日誌)。你做不是想要在上述位置之外使用非參考集合,除了上面顯示的遺留v2.0位置。

更多關於參考組件:http://blogs.msdn.com/b/msbuild/archive/2007/04/12/new-reference-assemblies-location.aspx

不幸的是,要真正學會解決這些地方的規則,你必須在C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets文件卑躬屈膝。它沒有完全公開記錄。 另請注意,這些搜索/解析規則與針對csc.exe /referencecl.exe /FU標誌記錄的規則不同。這些規則看起來像他們傾向於使用運行時程序集,而不是引用程序集 - 這是不正確的。