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 calling
catkin_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
Author And Source
この問題について(CMakeLists.txtのcatkin_package()にハマった件), 我々は、より多くの情報をここで見つけました https://qiita.com/np_hsgw/items/76bc1849a6d36157f682著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .