ros中CmakeLists构建的一些关键

ros中CmakeLists构建的一些关键

1. find_package的作用

我们知道,大部分二进制安装的头文件都在/opt/ros/版本号/include/ 库文件都在/opt/ros/版本号/lib 里。而catkin_make在编译过程中会自动从这两个目录下寻找头文件和库文件。我们甚至可以在当前包的头文件中#include <nav_msgs/Odometry.h>而不在CmakeLists中 find_package(nav_msgs)。但这样做是有弊端的。

find_package()的主要作用是根据查找的结果创建CMake环境变量。

  • <NAME>_FOUND:当库被查找到时置为true,否则为false

  • <NAME>_INCLUDE_DIRS<NAME>_INCLUDES:软件包导出的头文件路径

  • <NAME>_LIBRARIES<NAME>_LIBS:软件包导出的库的路径

  • <NAME>_DEFINITIONS:?

    也就是说,当你使用find_package时,返回的_INCLUDE_DIRS是所查找包cmake文件导出的头文件路径,而不仅仅是查找包的头文件路径。

以cv_bridge 包为例,如果你不在CmakeLists中查找cv_bridge,而是直接在头文件中包含#include <cv_bridge/cv_bridge.h>。编译时就会报无法找到opencv头文件的错误。因为系统只是在/opt/ros/版本号/include/ 目录下找到了相应的cv_bridge头文件,但并没有将opencv的头文件目录纳入寻找范围。而如果使用find_package,这是因为cv_bridge cmake文件输出的头文件目录也包括了opencv的头文件目录。

2. find_package会递归查找包吗

假设path_searching这个包find_package了plan_env这个包。而Bspline这个包又使用了path_searching这个包,那是否能够只find_package(path_searching)这个包呢。 很遗憾,如果没有额外操作的话,这是行不通的。因为find_package会根据查找包的cmake文件来返回相关环境变量信息。而CMakeList是具有独立性的。正常来说,如果path_searchign 这个包的配置如下:

catkin_package( INCLUDE_DIRS include  
                LIBRARIES path_searching  
                CATKIN_DEPENDS    
                DEPENDS )

那使用find_package(path_searching)所返回的头文件及库文件目录仅是path_searching包的头文件及目录,而不会有plan_env的路径信息。这也就意味着,正常情况下,想要在Bspline包中使用plan_env和path_searching, 必须利用find_package查找path_searching 和 plan_env

3. 能不能不要多次包含

那么,有没有例外呢。是有的

首先, 大多数二进制安装的ros包,如果不依赖于其他第三方库(所谓第三方库,指的是既不在ros目录下,也不系统默认目录下的库), 是可以直接在头文件和源文件中调用而不需要在cmakelist中包含依赖的。

其次,如若是第三方库,我们也可以利用catkin_package中的CATKIN_DEPENDS标签,来避免重复嵌套调用。还是以上述Bspline, path_searching, plan_env三个包为例。

如果我们将path_searchign包CmakeLists中的catkin_package部分改为如下:

catkin_package( INCLUDE_DIRS include  
            LIBRARIES path_searching  
            CATKIN_DEPENDS  plan_env  
            DEPENDS )

我们在CATKIN_DEPENDS后加上 plan_env软件包, 这意味着,每次编译,运行path_searching,都需要找到plan_env。

在这之后,我们直接在Bsplined的CmakeList中find_pacakge(path_searching) 而不找plan_env. 并且 在Bspline的package.xml中规定好Bspline依赖于path_searching,让path_searching先于Bspline编译,则我们就可以在Bspline中正常使用这两个包。

4. package.xml定义依赖和编译顺序。

package.xml中主要包含 <buildtool_depend> <build_depend> <build_export_depend> <exec_depend> 这几个标签。

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
   <build_depend>path_searching</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
   <build_export_depend>path_searching</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>path_searching</exec_depend>

其中,我们加入一项 <build_depend>path_searching</build_depend>表示先编译path_searching包再编译本包,由于path_searching.xml同样有<build_depend>plan_env</build_depend>,则plan_env, path_searching, bspline三个包将被顺序编译。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS2CMakeLists.txt是用来构建和编译ROS2软件包的配置文件。它包含了一系列指令和参数,用于指导构建系统进行编译和链接操作。根据引用\[1\]的示例,可以看到CMakeLists.txt文件首先指定了所需的CMake的最低版本,然后定义了项目名称为nav2_costmap_2d。引用\[2\]的代码展示了在CMakeLists.txt使用find_package命令来查找所需的依赖包,例如roscpp、rospy、std_msgs和message_generation。这些依赖包是在构建过程需要的库和工具。最后,引用\[3\]提到了CMakeLists.txt的重要性,它决定了ROS2软件包的编译是否成功。因此,了解和正确编写CMakeLists.txt对于ROS2编程非常重要。 #### 引用[.reference_title] - *1* [详细分析一个ROS2 CMakeLists.txt文件](https://blog.csdn.net/shoufei403/article/details/125831552)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [ROS cmakelist](https://blog.csdn.net/zacharyzqc/article/details/103130779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值