10

cmake を使用して C++/CLI プロジェクトをセットアップしようとしています。Visual Studio 2010 でこれを行うことに成功しましたが、現在、Visual Studio 2008 を必要とするレガシー ソリューションを使用しています。Visual Studio 2010 では、次のように 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 で試してみると、参照が表示されず、プロジェクトが「共通言語ランタイム サポートなし」に設定されています。コンパイラ オプションを見ると、/clr がコンパイラに渡されていることがわかります。 . ただし、おそらく参照が不足しているため、多くのコンパイラエラーが発生します。これを正しく設定する方法を知っている人はいますか?

4

2 に答える 2

9

VS_DOTNET_REFERENCES プロパティへの唯一の「実際の」ソース コード参照は、CMake ソース ファイル Source/cmVisualStudio10TargetGenerator.cxx にあります。

これが実際に意味すること: VS_DOTNET_REFERENCES は、Visual Studio 2010 用の CMake ジェネレーターと、それを継承するジェネレーターのいずれかに対してのみ実装されます。(現在、VS 2012 および 2013 の最新の CMake バージョンに存在します...)

以前のバージョンの Visual Studio でこのプロパティをサポートするように CMake ソース コードを変更することはおそらく可能ですが、現時点ではまだ作業が完了していません。

于 2013-09-09T21:06:08.737 に答える
2

@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.dll、などのシステム アセンブリの場合PresentationCore.dllは、 を介してコンパイラへの完全な絶対パスを指定する必要がありますasmPath。コンピューターにインストールされていないアセンブリではなく、参照アセンブリを使用する必要があります。たとえば、Visual Studio 2008 の 3.5 のターゲット フレームワークの場合、次のディレクトリで参照ファイルを次の順序で検索する必要があります。

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

于 2015-09-15T22:30:59.297 に答える