- 在含ROS的功能包中,我们会在cmakelist中看到catkin_package的身影,例如:
catkin_package(
CATKIN_DEPENDS
diagnostic_updater
dynamic_reconfigure
geometry_msgs
nav_msgs
rosbag
roscpp
sensor_msgs
std_srvs
tf2
tf2_msgs
tf2_ros
INCLUDE_DIRS include
LIBRARIES amcl_sensors amcl_map amcl_pf
)
那么就简单谈一下catkin_package到底有什么用:
首先,要明确一点哈:编译程序,分为catkin_make和make两种方式,前者是在工作空间编译,后者是在工程文件的build文件中进行编译。好,那么问题就来了。无论是在工作空间还是工程文件的build中就那些编译,都需要利用cmakelist。
比如我需要用到PCL库,我在cpp文件里面include了PCL的相关头文件,我就必须在cmakelist中链接PCL库,问题就在“如何链接opencv库”
- 方案一:find_package(PCL REQUIRED)
- 方案二:
catkin_package(
DEPENDS PCL
INCLUDE_DIRS include
)
由此我们可以看出,find_package和catkin_package在某些方面作用是相同的。
步入正题:
- find_package()可以帮助我们找到头文件和库,catkin_package()同样可以,catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
一句话总结:如果想在工作空间进行catkin_make,就需要catkin_package()
至于catkin_package的深入研究,参考:
https://zhuanlan.zhihu.com/p/299148013
- 需要注意的是:catkin_package中添加的包,必须在package.xml中指定依赖。
最简单的例子;
catkin_package中添加nav_msgs、rosbag等包,在package.xml中也要加入对应的依赖,否则就会报错;