CMakeLists.txtのcatkin_package()にハマった件


はじめに

catkin_makeでビルドしているときに、なぜか実行ファイルが見つからないというエラーが発生したのでその調査結果をメモ

前提条件

  • 環境はROS melodic
  • ビルドツールはcatkin_make

結論

  • 各パッケージのCMakeLists.txtにcatkin_pacakge()が記載されていないと、実行ファイルが~/catkin_ws/devel/libに格納されず、rosrun等でノードを実行しようとしても以下の様に実行ファイルが見つからないというエラーが発生する。
user@user-ubuntu:~/catkin_ws$ rosrun test_pkg test_pkg_node
[rosrun] Couldn't find executable named test_pkg_node below /home/user/catkin_ws/src/test_pkg
  • 公式ドキュメントを参照すると、たしかにパッケージごとに1回呼び出す必要があると書いてある。

Note

It must be called once for each package. It is indirectly callingcatkin_destinations() which will provide additional output variables. Please make sure to call catkin_package() before using those variables.

  • この時までcatkin_package()はライブラリとして作成するパッケージにのみ記載すればいいと考えていた。
    • しかし、実際は外部から参照されなくとも引数を空にして必ず1回だけ呼び出す必要があることがわかった。

実験

  • 以下のようなフォルダ構成でHELLOと表示する簡単なパッケージを用意
.
├── build
├── devel
└── src
    └──  test_pkg
        ├── CMakeLists.txt
        ├── include
        ├── package.xml
        └── src
            └── main.cpp
main.cpp
#include <ros/ros.h>

int main(int argc, char **argv) {
  ros::init(argc, argv, "test_pkg_node");
  ros::NodeHandle n;

  ROS_INFO("HELLO");
  ros::spin();
  return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(test_pkg)

find_package(catkin REQUIRED COMPONENTS
  roscpp
)
#catkin_package()
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/main.cpp)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

package.xml
<?xml version="1.0"?>
<package format="2">
  <name>test_pkg</name>
  <version>0.0.0</version>
  <description>The test_pkg package</description>
  <maintainer email="[email protected]">user</maintainer>
  <license>TODO</license>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <exec_depend>roscpp</exec_depend>
</package>

  • この状態でcatkin_makeしrosrunで実行すると以下のようなエラーが発生
user@user-ubuntu:~/catkin_ws$ rosrun test_pkg test_pkg_node
[rosrun] Couldn't find executable named test_pkg_node below /home/user/catkin_ws/src/test_pkg
  • devel/libディレクトリの中身は空のまま
.
├── build
├── devel
|   └──  lib
└── src
  • CMakeLists.txtのcatkin_package()を有効にしてビルドするとdevel/libディレクトリ内に実行ファイルが作成される。
.
├── build
├── devel
|   └──  lib
|        └──  test_pkg
|             └──  test_pkg_node
└── src