gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

ROSにおけるCMakeLists.txtの書き方

逐次わかったこと、気づいたことを追記していきます。

catkin_package(  # ここには自ら(このCMakeLists.txtが含まれているROS Packageのことを書きます
INCLUDE_DIRS # headerファイルを探しに行く時のルートディレクトリを記載します → 1)へ
LIBRARIES # add_libraryで定義したライブラリ名を列挙します → 2)へ
CATKIN_DEPENDS # あんまりわかっていないので後日....
DEPENDS # あんまりわかっていないので後日....
)

1) INCLUDE_DIRS
例えば"package_name/include/foo/bar.h"というファイルがあります。find_packgeなどで外部の情報を得ない限り、ソースファイルと同じディレクトリのheaderしかincludeできません。しかしINCLUDE_DIRSを定義すれば、定義したパスからも探してくれます。例えば"INCLUDE_DIRS include"と定義すれば、ソースファイルに"#include "と記載すれば、そのheaderは見つかります。少し変えて"INCLUDE_DIRS include/foo"とすれば、"#include "とすれば見つかります。なおINCLUDE_DIRSにパスを書く場合は、CMakeLists.txtからの相対パスを書くか、絶対パスを書く必要があります。

2)LIBRALIES
add_libraryで定義したライブラリ名を列挙することで、他のパッケージがこのパッケージをfind_packageした時、他のパッケージがそのライブラリを使用することができます。そのため、LIBRARIESに間違ってもadd_executableに記載した名前、はたまた存在しない名前を書くと、他のパッケージがfind_packageした時に、"CMake Error at /home/ユーザ名/catkin_ws/devel/share/パッケージ名/cmake/パッケージ名Config.cmake:該当行 (message):
Project 'その他のパッケージ' tried to find library 'ライブラリ名'. The library is neither a target nor built/installed properly. Did you compile project 'floor_plan_matcher'? Did you find_package() it before the subdirectory containing its code is included?"等と表示され、find_packgeが失敗します。ご注意ください。このパッケージが出た場合、find_packageしようとしているパッケージのLIBRARIESの定義を確認してみてください。