4

前文: C# csproj を、C++ および C++/CLI コードベースの cmake ビルドの残りの部分と統合しようとしています。CMake は Visual Studio の .NET とうまく連携しないため、これを実行しないようアドバイスを受けましたが、いくつかのカスタマイズを実装した後、非常に近いと感じています。

私のカスタマイズの一部は、configure_file コマンドを使用して CMake 時に csproj ファイルを編集し、実行中のビルドのタイプ (x86、x64 など) に応じてカスタマイズすることです。

問題は、いくつかの ProjectReference タグを使用して C++/CLI プロジェクトを参照していることです。

<ProjectReference Include="..\..\WrapperProject\WrapperProject.vcproj">
  <Project>{7BD6E175-CDD1-4F8D-A3B2-0AC862E62C03}</Project>
  <Name>WrapperProject</Name>
</ProjectReference>

...そして、CMake キャッシュが再構築されるたびにプロジェクトの GUID が変更されるため、GUID を静的のままにすることはできません (間違っている場合は修正してください)。

したがって、私がやりたいことは、これらのプロジェクトに計画されている GUID を CMake で見つけ、それに応じて vcproj ファイルを編集することです。

Google は、次のように「set_property」を使用して GUID を設定できると言っています。

set_property(CACHE ${target_name}_GUID_CMAKE PROPERTY VALUE ${MY_GUID} )

...しかし、同等のゲッターが見つからないようです。私はこのようなことを試しました:

get_property (WRAPPER_GUID キャッシュ内部プロパティ WrapperTargetName_GUID_CMAKE)

...運がない。あなたの助けに感謝します!

4

2 に答える 2

4

これをさらにいじってみると、Fraser が指摘したことに気付きました。つまり、CMake を新たに実行したときに GUID が利用できるとは期待できないため、この方法は常に機能するとは限らないということです。そこで、CMake メーリング リストで提案されているのを見たルートに行きました。これは、自分で GUID 値を明示的に設定するというものです。

したがって、各 C++/CLI ラッパー プロジェクトの CMakeLists.txt には、次のようなものがあります。

# Set a global cache variable for this project GUID
# The TestAppNet csproj needs this GUID to properly reference this project
set_property(GLOBAL PROPERTY Wrapper_GUID "1897F4D1-E929-444E-9343-00F094113772") 
get_property(projectGUID GLOBAL PROPERTY Wrapper_GUID)
MESSAGE( STATUS "Setting project GUID to: ${projectGUID}")
set(Wrapper_GUID_CMAKE "${projectGUID}" CACHE INTERNAL "Project GUID")

C# プロジェクト CMakeLists.txt には、次のようなものがあります。

get_property(CMAKE_WRAPPER_GUID GLOBAL PROPERTY Wrapper_GUID)
MESSAGE( STATUS "Setting Wrapper GUID to: ${CMAKE_WRAPPER_GUID}" )

...そして、CMAKE_WRAPPER_GUID は、configure_file コマンド中に入力される .csproj ファイルの変数として使用されます。

これが効率的かどうかはわかりませんが、うまくいくようです!

于 2013-03-15T12:39:04.370 に答える
2

あなたの構文は少しずれています。あなたはおそらく次のことを意味していました:

get_property(WRAPPER_GUID CACHE WrapperTargetName_GUID_CMAKE PROPERTY VALUE)

ただし、これは値を取得するための比較的複雑な方法です。あなたはただ行うことができます:

set(WRAPPER_GUID ${WrapperTargetName_GUID_CMAKE})

最後に、GUID は CMake の最初の実行後まで利用できないため、これは理想的ではありません。したがって、新しいビルド ツリーの場合、これを使用するには CMake を 2 回実行する必要があります。

于 2013-03-14T23:47:38.883 に答える