0. 序文
この間、私は cmake を使用してさまざまなパッケージに適合する方法を学び始めました。簡単に確認できるように、いくつかのプロセスがここに記録されています。
このセクションでは、サードパーティのライブラリの参照と独自のライブラリのエクスポートについて説明します。
1. 外部ライブラリをインポートする
たとえば、github から ompl ライブラリを複製し、それを独自のパッケージで使用したいと考えています。どうすればよいでしょうか?
まず、ompl パッケージと独自の pkg パッケージをワークスペースの src ディレクトリに配置し、事前に ompl をコンパイルします。
colcon build --packages-select ompl
次のコードを pkg パッケージの CMakeFiles ファイルに追加します。
find_package(ompl REQUIRED)
find_package
指定されたライブラリの構成ファイルを自動的に見つけてロードします。まず現在の階層ディレクトリ (インストール フォルダー) を検索します。見つからない場合は、システム ディレクトリ (usr/local/share) に移動して検索を続けます (バイナリを使用する場合)。同時にインストール (ソース コードでコンパイルした後、ソース コードが最初に使用されます)。
(REQUIRED: オプションのフィールド。パッケージが見つかる必要があることを意味します。パッケージが見つからない場合、CMake 全体が直ちに停止されます。REQUIRED が指定されていない場合、CMake は実行を継続します。)
ルックアップが完了すると、いくつかのキーワードが返されます。
- <LibraryName>_FOUND は、
目的の関数パッケージが正常に見つかったかどうかを判断するために使用されます。 - <ライブラリ名>_INCLUDE_DIR または <ライブラリ名>_INCLUDES には、
ヘッダー ファイルが含まれるフォルダーのパスが含まれます - <ライブラリ名>_LIBRARY または <ライブラリ名>_LIBRARIES
ライブラリ ファイル パス
キーワードによって具体的にインデックス付けされたパス アドレスを表示したい場合は、次のコマンドを使用できます。
message(STATUS "find OMPL_INCLUDE:${OMPL_INCLUDE_DIRS}")
message(STATUS "find OMPL_LIB:${OMPL_LIBRARIES}")
ぜひチェックしてみてください。コンパイルにはcolcon buildを使用しているため、出力されたログ情報はワークスペース下のlogフォルダーに保存されます。日付と時刻に対応するフォルダーに入ってstdoutファイルを開くだけです。
次に、ターゲット ライブラリのヘッダー ファイルとライブラリ ファイルをインポートします。
include_directories(
${
OMPL_INCLUDE_DIRS}
)
add_executable(ompl_test_node
src/ompl_test_node.cpp
)
target_link_libraries(ompl_test_node
${
OMPL_LIBRARIES}
)
このようにして、ヘッダー ファイルが正常にインポートされ、ライブラリ ファイルがターゲットの実行可能ファイルに正常にリンクされました。
2.カスタムライブラリをエクスポートする
この部分は記事を参照しています: https://zhuanlan.zhihu.com/p/87738686
逆に、find_package() を通じて他の人や将来の自分にモジュールを使用させることもできます。
動的ライブラリをエクスポートする方法については、上記を次のようにadd_executable
変更するadd_library
だけです。
add_library(omcl_ros2 SHARED
src/ompl_test_node.cpp
src/fcl_test_node.cpp
)
ament_target_dependencies(omcl_ros2
rclcpp
)
target_link_libraries(omcl_ros2
${
OMPL_LIBRARIES}
${
FCL_LIBRARIES}
)
install(TARGETS
omcl_ros2
DESTINATION lib/${
PROJECT_NAME}
)
ダイナミック ライブラリは、によってinstall
lib フォルダーにインストールできます。他のパッケージで呼び出された場合、動的ライブラリへのパスは find_package を通じて取得できます。
最後に、ヘッダー ファイルをインストールします。
install(DIRECTORY
include/${
PROJECT_NAME}
DESTINATION include
)