catkin_package()是什么意思?
DEPENDS 和 CATKIN_DEPENDS 用来告诉 catkin 需要将你程序包A的哪些依赖项传递给使用 find_package(...) 查找你的程序包的程序包B。
而在CMakeLists.txt中正好可以找到find_package()和catkin_package(),也就是说,catkin_package()是作用在find_package()中的。
1 cmake_minimum_required(VERSION 2.8.3)
2 project(beginner_tutorials)
3
4 ## Find catkin and any catkin packages
5 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
6
7 ## Declare ROS messages and services
8 add_message_files(DIRECTORY msg FILES Num.msg)
9 add_service_files(DIRECTORY srv FILES AddTwoInts.srv)
10
11 ## Generate added messages and services
12 generate_messages(DEPENDENCIES std_msgs)
13
14 ## Declare a catkin package
15 catkin_package()
例如,假设你 find_package(Boost REQUIRED),并在你的安装的头文件中有代码行 #include <boost/functio n.hpp>。为使一个依赖于你的拥有#include<boost/function.h>的程序包能使用你的头文件,它们需要在自己的 include 路径中包含 Boost 的 include目录(其实在visual c++中#include该头文件是不是同理),还需要连接 Boost 的库(同前文注释)。由于你已经在头文件中导出(是从程序中的#include导出的吗?)(难道说在visual c++中的#include是一级操作,接下来的操作是生成类CMakeLists.txt这样的文件?)该依赖,它们应该能从你那里获得依赖。也就是它们不再需要 find_package(Boost REQUIRED)(也就是依赖一个包,而被依赖的这个包不需要重复声明它的依赖项) ,因为它们是使用你的包构建的,而不是直接使用 Boost。
你的程序包(是一级依赖还是二级依赖?从后文看,应该是一级依赖)依赖于 Boost 这一事实是一个实现细节,因此当一些包(一级包)通过 find_package(...) 查找你的包(二级包)时,它们(一级包)能间接获得对 Boost 的依赖。让这种机制起作用方法是在你的 catkin_package(...) 调用中加入 DEPENDS Boost参数(在二级包中)(加上DEPENDS Boost就能依赖于被依赖包的依赖项)。其实现细节是:
catkin 将 find_package(Boost)(作用于全局)
并向 ${your_pkg_LIBRARIES} 添加 ${Boost_LIBRARIES}(作用于一级包)
向 ${your_pkg_INCLUDE_DIRS} 添加 ${Boost_INCLUDE_DIRS}。(作用于二级包)
your_pkg_LIBRARIES应该是使用Boost的包,结合上文应该是为这个包的运行环境维护了很多变量,比说x现在说到的your_pkg_LIBRARIES。
我们应该注意,catkin 将 find_package() 你告诉它的确切的程序包名, 然后尝试使用该包的 _LIBRARIES 和 _INCLUDE_DIRS 变量(证明每一个库还在UBUNTU环境下还拥有很多变量)。但是 find_package(...) 得到的结果变量的形式并不总是这样(结合下文,应该说的是变量名称不是固定的),因为 CMake 没有强制执行此操作(这句话的意思应该是CMake没有强制约定命名规则?)。例如当 find_package python包时,find_package(PythonLibs REQUIRED) 的结果变量的形式为:PYTHON_INCLUDE_PATH(这是对your_pkg_DIRS进行赋值之后的值,PYTHON_INDLUDE_PATH对应Boost_INCLUDE_DIRS,应该注意的是,它们的命名规则是不一致的,如果一致的话,PYTHON_INCLUDE_PATH应该叫PYTHON_INCLUDE_DIRS)。
find_package(OpenGL REQUIRED) 的结果变量为 OPENGL_INCLUDE_DIR。(这个时候命名规则与添加Boost库的例子又一致了)。
除了变量前缀变得不一样(PythonLibs -> PYTHON),后缀也变得不标准(PYTHON_INCLUDE_PATH and OPENGL_INCLUDE_DIR vs *_INCLUDE_DIRS,在这句话中有三种后缀,分别是PATH和DIR以及DIRS)。在这种情况下你就需要使用INCLUDE_DIRS 选项将传递包含头文件目录的变量到catkin_package()中(这个变量的意思是include dirs),同理LIBRARIES选项也是干的类似的事情。
CATKIN_DEPENDS 选项和 DEPENDS 选项十分相似,但是对于CATKIN_DEDPENS来说,你只能在其列表中放置 catkin 程序包(即是用roscreate-pkg创建的程序包)。将 catkin 依赖设置为一个单独的选项的好处是可以让 catkin 执行一些额外的检查,然后警告你有什么不妥的做法。
最后,给个简单的示例 CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.3)
project(foo)
find_package(Boost REQUIRED COMPONENTS
system
thread
)
find_package(PythonLibs REQUIRED)
find_package(OpenGL REQUIRED)
find_package(catkin REQUIRED COMPONENTS
rosconsole
roscpp
)
include_directories(
include
${catkin_INCLUDE_DIRS}
${OPENGL_INCLUDE_DIR}
${PYTHON_INCLUDE_PATH}
)
catkin_package(
INCLUDE_DIRS include ${OPENGL_INCLUDE_DIR}
LIBRARIES foo ${OPENGL_LIBRARIES}
CATKIN_DEPENDS roscpp
DEPENDS Boost
)
...
此例中你可以看到我 find_package(find_package(Boost REQUIRED COMPONENTS))并将它传递给 catkin_package() 的 DEPENDS 部分(catkin_package(DEPENDS Boost))。因为它(catkin_package())生成的是兼容 CMake 的变量(变量格式一致???)。
在CMakeLists.txt文件中find_package(PythonLibs REQUIRED),但是不用将它传递给 catkin_package(),因为我没有在我任何暴露给外界的头文件中包含它。我 find_package(OpenGL...) ,由于它生成的不是兼容 CMake 的变量,所以我将其显示地传递给 catkin_package() 的 INCLUDE_DIRS 和 LIBRARIES 部分,(不用变量了,直接赋值)。最后,我 find_package(catkin ... rosconsole roscpp,并在内部使用,但是我可能只在 .c* 文件中使用了 rosconsole,因此我不用传递它,所以 catkin_package() 的 CATKIN_DEPENDS 部分我只需放入 roscpp。
最后要说明但是,如果一个程序包有直接使用像 Boost 这样的依赖项,那么它们应该确保用 find_package(...) 显示地查找它,而不是通过其他包隐式地依赖于它。举个这样的例子,如果程序包 foo 将 Boost 作为依赖项导出,又有程序包 bar 依赖于 foo,但也在内部使用 Boost,那么 bar 即使在没有显示依赖 Boost 的情况下也能编译正常。 但后来 foo 可能决定重构并删除了它对 Boost 的依赖,那么现在 bar 将无法编译,因为它不再具有通过 foo 传递来的对 Boost 的隐式依赖。
catkin_package()是什么意思?的更多相关文章
- 在按照ROS官方步骤操作,同时用Git管理整个过程,git clone的新catkin_ws报错: catkin_package() include dir 'include' does not exist relative to
在按照ROS官方步骤操作,同时用Git管理整个过程,git clone的新catkin_ws报错如下: CMake Error at /opt/ros/kinetic/share/catkin/cma ...
- QT 开发ros gui过程中遇到:error: catkin_package() include dir 'include' does not exist relative to '/home/jun/catkin_ws/src/qt_ros_test' /opt/ros/kinetic/share/catkin/cmake/catkin_package.cmake:102 (_catkin_p
这是因为在ros工作空间的包中没有include文件夹造成的,所以在该路径下创建include的文件夹,问题就解决了.
- QT下调试基于ros的catkin项目
1.首先告诉qt ros的搜索路径,通过修改qt creator 桌面启动程序来实现 sudo gedit ~/.local/share/applications/DigiaQtOpenSour ...
- ROS语音交互(三)科大讯飞语音在ROS平台下使用
以上节tts语音输出为例 下载sdk链接:http://www.xfyun.cn/sdk/dispatcher 1.下载SDK,解压: 2.在ROS工作空间下创建一个Package: catkin_c ...
- 在ROS下编写自己的节点来订阅话题(C++)
参考 http://blog.csdn.net/u013453604/article/details/49102957 的博客,其实这些内容和 <开源机器人操作系统> 这本书差不多 ...
- 创建一个ROS msg
1. msg •msg:msg文件是简单的文本文件,用于描述ROS中消息(消息的各个参数项).用于为不同的编程语言生成有关消息的源代码. •srv:描述服务的文件,由两部分组成:请求和反馈: msg文 ...
- ROS主题发布订阅
节点是一个可执行程序,它连接到了ROS的网络系统中.我们将会创建一个发布者,也就是说话者节点,它将会持续的广播一个信息. 改变目录到之前所建立的那个包下: cd ~/catkin_ws/src/beg ...
- catkin_simple 的使用
Catkin simple 可用于规范catkin package, 并简化CMakeLists Dependencies are just listed once as build-depend ...
- 用C++写一个简单的订阅者
打开一个终端,进入到beginner_tutorials包下面: cd ~/catkin_ws/src/beginner_tutorials 建立文件src/listener.cpp: vim src ...
随机推荐
- Servlet+JSP 原理
Servlet是用Java编写的Server端程序,与协议和平台无关,可移植行较强. Servlet在编辑时须要导入特定的Servlet API 的包,类似于普通Java程序的写法. Servlet採 ...
- [计算机联网故障]WIFI接入正常,但是上网不正常(两种情况)
今天同事拿来一个笔记本,说是连接WIFI都正常,但是就是无法上网.换了单位的wifi和他自己的手机共享wifi都是无法上网. 我首先检查了一下IP地址设置,看是否指定了IP.没有. 然后取消IPv6. ...
- PHP mysql 连接ipV6地址
需要在PHP页面中通过ipv6连接数据库,但是发现无论是用mysql_connect还是mysqli_connect,如果host是ipv6格式,就不能正常连接,会提示“php_network_get ...
- FFmpeg将多张图片合成视频 子视频合并
FFmpeg将多张图片合成视频 - CSDN博客 https://blog.csdn.net/wangshuainan/article/details/77914508 Slideshow – FFm ...
- UniDAC连接Embedded MySQL server
Simple question about MySQL embedded application. Post a reply 7 posts • Page 1 of 1 Simple ques ...
- Bootstrap button源码分析
/* ======================================================================== * Bootstrap: button.js v ...
- YTU 2622: B 虚拟继承(虚基类)-沙发床(改错题)
2622: B 虚拟继承(虚基类)-沙发床(改错题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 487 解决: 393 题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(S ...
- php语法错误导致服务器错误(500)解决
PHP编码出错不提示,而是提示500错误,这对于开发来说,是很不方便的.下面讲解如何开启错误提示步骤: 1. 打开php.ini文件.以我的ubuntu为例,这个文件在: /etc/php5/apac ...
- openStack集群封装记录
- bzoj2679: [Usaco2012 Open]Balanced Cow Subsets(折半搜索)
2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 462 Solv ...