[解決済み】CMAKE_MODULE_PATHを指定する必要がある場合、find_package()はどのように使用するのでしょうか?
質問
CMakeを使用してクロスプラットフォームビルドシステムを動作させようとしています。現在、このソフトウェアにはいくつかの依存関係があります。私はそれらを自分でコンパイルし、私のシステムにそれらをインストールしました。
インストールされたいくつかのサンプルファイルです。
-- Installing: /usr/local/share/SomeLib/SomeDir/somefile
-- Installing: /usr/local/share/SomeLib/SomeDir/someotherfile
-- Installing: /usr/local/lib/SomeLib/somesharedlibrary
-- Installing: /usr/local/lib/SomeLib/cmake/FindSomeLib.cmake
-- Installing: /usr/local/lib/SomeLib/cmake/HelperFile.cmake
これでCMakeは
find_package()
を開くと
Find*.cmake
のような変数を定義し、システム上のライブラリを検索します。
SomeLib_FOUND
などです。
私のCMakeLists.txtには、このようなものが含まれています。
set(CMAKE_MODULE_PATH "/usr/local/lib/SomeLib/cmake/;${CMAKE_MODULE_PATH}")
find_package(SomeLib REQUIRED)
最初のコマンドは、CMake が検索する場所を定義します。
Find*.cmake
というディレクトリを追加し
SomeLib
という名前の
FindSomeLib.cmake
は見つけることができますので
find_package()
動作
は期待通りでした。
しかし、これはちょっと奇妙なことです。
find_package()
が存在するのは、クロスプラットフォームでないハードコードされたパスから逃れるためです。
これは通常どのように行われるのでしょうか?をコピーすればいいのでしょうか?
cmake/
ディレクトリの
SomeLib
をプロジェクトに追加し
CMAKE_MODULE_PATH
相対的に?
どのように解決するのですか?
コマンド
find_package
には2つのモードがあります。
Module
モードと
Config
モードを使用します。あなたがやろうとしているのは
使用
Module
モードが必要な場合、実際には
Config
モードを使用します。
モジュールモード
Find<package>.cmake
ファイル位置
内の
を作成します。このようなものです。
CMakeLists.txt
cmake/FindFoo.cmake
cmake/FindBoo.cmake
CMakeLists.txt
のコンテンツを表示します。
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
find_package(Foo REQUIRED) # FOO_INCLUDE_DIR, FOO_LIBRARIES
find_package(Boo REQUIRED) # BOO_INCLUDE_DIR, BOO_LIBRARIES
include_directories("${FOO_INCLUDE_DIR}")
include_directories("${BOO_INCLUDE_DIR}")
add_executable(Bar Bar.hpp Bar.cpp)
target_link_libraries(Bar ${FOO_LIBRARIES} ${BOO_LIBRARIES})
なお
CMAKE_MODULE_PATH
は優先順位が高く、標準的な
Find<package>.cmake
ファイルを作成します。
コンフィグモード(インストール)
<package>Config.cmake
ファイルの場所
外側
で生成され
install
のコマンドで、他のプロジェクト(
Foo
など)。
foo
ライブラリを使用します。
> cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Foo)
add_library(foo Foo.hpp Foo.cpp)
install(FILES Foo.hpp DESTINATION include)
install(TARGETS foo DESTINATION lib)
install(FILES FooConfig.cmake DESTINATION lib/cmake/Foo)
設定ファイルの簡易版。
> cat FooConfig.cmake
add_library(foo STATIC IMPORTED)
find_library(FOO_LIBRARY_PATH foo HINTS "${CMAKE_CURRENT_LIST_DIR}/../../")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION "${FOO_LIBRARY_PATH}")
にインストールされたプロジェクトは、デフォルトで
CMAKE_INSTALL_PREFIX
ディレクトリに格納されます。
> cmake -H. -B_builds
> cmake --build _builds --target install
-- Install configuration: ""
-- Installing: /usr/local/include/Foo.hpp
-- Installing: /usr/local/lib/libfoo.a
-- Installing: /usr/local/lib/cmake/Foo/FooConfig.cmake
コンフィグモード(使用)
使用方法
find_package(... CONFIG)
を含めることができます。
FooConfig.cmake
インポートされたターゲットと
foo
:
> cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Boo)
# import library target `foo`
find_package(Foo CONFIG REQUIRED)
add_executable(boo Boo.cpp Boo.hpp)
target_link_libraries(boo foo)
> cmake -H. -B_builds -DCMAKE_VERBOSE_MAKEFILE=ON
> cmake --build _builds
Linking CXX executable Boo
/usr/bin/c++ ... -o Boo /usr/local/lib/libfoo.a
インポートされたターゲットは 非常に を設定することができます。私の 回答 .
更新情報
関連
-
[解決済み] CMakeにソースディレクトリにある静的ライブラリをリンクするように指示するにはどうすればよいですか?
-
[解決済み] CMakeの出力をクリアするための'cmake clean'コマンドを探しています。
-
[解決済み] configure --prefix=DIR && make all install ' と同等のCMakeは何ですか?
-
[解決済み】CMAKE_MODULE_PATHを指定する必要がある場合、find_package()はどのように使用するのでしょうか?
-
[解決済み] CMakeでソースファイルを指定する場合、GLOBで指定するのと、1ファイルずつ指定するのと、どちらが良いですか?
-
[解決済み] CMakeでディレクトリを作成する
-
[解決済み] CMAKEがエラーを発生させる原因
-
[解決済み] CMakeで警告レベルを設定するには?
-
[解決済み] CMAKE_CURRENT_SOURCE_DIRとCMAKE_CURRENT_LIST_DIRの相違点
-
[解決済み] CMakeを使用して、CTestから冗長出力を得るにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CMakeでコンパイラを指定するには?
-
[解決済み] CMakeにソースディレクトリにある静的ライブラリをリンクするように指示するにはどうすればよいですか?
-
[解決済み】CMAKE_MODULE_PATHを指定する必要がある場合、find_package()はどのように使用するのでしょうか?
-
[解決済み] CMakeでソースファイルを指定する場合、GLOBで指定するのと、1ファイルずつ指定するのと、どちらが良いですか?
-
[解決済み] CMakeでディレクトリを作成する
-
[解決済み] 外部ライブラリへのCMakeリンク
-
[解決済み] CMakeで警告レベルを設定するには?
-
[解決済み] CMAKE_CURRENT_SOURCE_DIRとCMAKE_CURRENT_LIST_DIRの相違点
-
[解決済み] CMakeを使用して、CTestから冗長出力を得るにはどうすればよいですか?
-
[解決済み] CMake target_link_libraries インターフェース依存性