2012-09-19 18 views
9

cmakeを使用してC++/CLIプロジェクトを設定しようとしています。私は、Visual Studio 2010でこれをやって成功を収めているが、私は今のVisual Studio 2010でのVisual Studio 2008を必要とするレガシー溶液で働いています、このように私の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でプロジェクトを調べると、すべての参照が表示され、「Common Language Runtime Support」が有効になっています。私はVisual Studio 2008でそれを試してみると、私は参照が表示されません、プロジェクトは "共通言語ランタイムサポートなし"に設定私はコンパイラのオプションを見て、私は/ clrがコンパイラに渡されていることがわかります。しかし、私はまだそれが参照が不足しているため、おそらく多くのコンパイラエラーが発生します。誰もこれを正しく設定する方法を知っていますか?

+0

あなたはこれを理解しましたか?私は同じ問題を抱えています(VS 2008でCLRフラグを設定できません)。 – Kohanz

+1

私たちはあきらめていませんが、それは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バージョンに存在しています...)

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

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を経由して、コンパイラへの完全な絶対パスを提供しなければなりません。参照アセンブリを使用する必要があり、コンピュータにインストールされていないアセンブリは使用しないでください。例としては、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プロジェクトをビルドすると、上記の場所にあるファイルへの絶対パスも渡されます(ビルドログを調べてみてください)。 NOT上記のレガシー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 /referenceまたはcl.exe /FUフラグについて記載されているものと同じではないことにも注意してください。これらのルールは、参照アセンブリではなくランタイムアセンブリを使用する傾向があるように見えますが、これは間違いです。