128

静的ライブラリをターゲットとしてエクスポートするプロジェクトAがあります。

install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)

ここで、プロジェクトAをプロジェクトBの外部プロジェクトとして使用し、そのビルドされたターゲットを含めます。

ExternalProject_Add(project_a
  URL ...project_a.tar.gz
  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)

include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)

問題は、プロジェクトBのCMakeListsを実行したときに、インクルードファイルがまだ存在しないことです。

インクルードを構築中の外部プロジェクトに依存させる方法はありますか?

更新:これと私が遭遇した他の一般的な問題に基づいて、短いCMakebyExampleチュートリアルを作成しました。

4

5 に答える 5

72

ここで 2 つの異なるパラダイムを混同していると思います。

ご指摘のとおり、非常に柔軟なExternalProjectモジュールはビルド時にコマンドを実行するため、プロジェクト A がインストールされた後にのみ作成されるため、プロジェクト A のインポート ファイルを直接使用することはできません。

includeプロジェクト A のインポート ファイルが必要な場合は、プロジェクトB の CMakeLists.txt を呼び出す前に、プロジェクト A を手動でインストールする必要がありfind_fileます。find_libraryfind_package

を利用したい場合はExternalProject_Add、次のようなものを CMakeLists.txt に追加する必要があります。

ExternalProject_Add(project_a
  URL ...project_a.tar.gz
  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)

include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)

ExternalProject_Get_Property(project_a install_dir)
include_directories(${install_dir}/include)

add_dependencies(project_b_exe project_a)
target_link_libraries(project_b_exe ${install_dir}/lib/alib.lib)
于 2013-03-02T15:22:15.977 に答える
8

編集: CMake には、これに対するサポートが組み込まれています。FetchContentを使用する新しい回答を参照してください。

二次的な make プロセスで依存ターゲットのビルドを強制することもできます

関連トピックに関する私の回答を参照してください。

于 2014-05-09T20:09:32.363 に答える