ROS2工程引入第三方库,如何编写CMakeList.txt

1.如何在 ROS 2 的工程中引入第三方的CAN驱动库

2.针对不同平台,如何编写CMake 实现,自动根据平台选择动态库

对于第一个问题,我们知道,在创建ROS 2功能包的时候,自动选择的构建类型是 ament_cmake

ament_cmake 链接库的方式是使用 ament_target_dependencies

CMakeLists.txt 默认使用链接库的方式是 target_link_libraries

所以你可以认为 ament_target_dependencies 是专门用于链接ROS 2 的库, target_link_libraries 用于链接普普通通的第三方库。

看一下卖家提供的驱动库

.
├── libcanbus.a
├── 
├── libusb-1.0.a
├── 
├── 
├── .0
└── .0.3.0

0 directories, 7 files

USB 库+CANBUS动态库

现在创建一个功能包,名字就叫 candriver

然后在功能包下新建 lib 目录,把所有的库文件拷贝进去

对了,卖家还提供了 arm64的库,一样的,新建 libarm,把库拷贝进去

然后把卖家提供的头文件放在include目录下,然后在是src下新建cantest.cpp下 最终得到如下目录结构

├── CMakeLists.txt
├── include
│   ├── canbus.h
│   └── candriver
├── install_lib.sh
├── lib
│   ├── libcanbus.a
│   ├── 
│   ├── libusb-1.0.a
│   ├── 
│   ├── 
│   ├── .0
│   └── .0.3.0
├── libarm
│   ├── libcanbus.a
│   ├── 
│   ├── libusb-1.0.a
│   ├── 
│   ├──  -> .0.3.0
│   ├── .0 -> .0.3.0
│   └── .0.3.0
├── package.xml
├── src
│   └── cantest.cpp
├── test

 

接着我们来编写CMakeLists

要让代码找到头文件,加这句话

include_directories(include)

    

要添加可执行文件

add_executable(cantest
  src/cantest.cpp
)

要链接ROS2的库,先find_package,再添加ament_target_dependencies

    要链接支持find_package 的第三方库,要用target_link_libraries来链接

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(guidebot_interfaces REQUIRED)

ament_target_dependencies(cantest
  rclcpp
  guidebot_interfaces
)

    

对于不支持的,要先找到对应库路径,我们放到工程目录下,可以直接通过CMakeLists.txt提供的${PROJECT_SOURCE_DIR}获取路径,拼接lib即可获取库

加上link所以这样写

set(CAN_LIB lib)  
message(STATUS "Linking libraries...")  
target_link_libraries(cantest  
  ${PROJECT_SOURCE_DIR}/${CAN_LIB}/  
  ${PROJECT_SOURCE_DIR}/${CAN_LIB}/  
)

    

如果你这样直接编译,是没有问题的,但最后运行的时候就会无法link,这是因为src目录下的库目录没有被 ROS 2的 setup.bash 添加到搜索目录

那问题来了,ROS 2 搜索哪些目录?

你随便source 一下setup.bash

然后echo $LD_LIBRARY_PATH

找找可以看到 /home/fishros/guidebot/install/candriver/lib

所以这个目录 install/candriver/lib 就是ROS2 运行期间会检索动态链接库的目录

知道了就可以把库拷贝过去

# 安装库文件  
message(STATUS "Installing libraries...")  
install(DIRECTORY ${CAN_LIB}/  
  DESTINATION lib/     
)

 

好的,此时再构建和运行就没问题了,我们的第一个问题就解决了

接着第二个问题,如果保证不同架构可以用同一份代码(这个还设计如果交叉编译,如何发布ROS2的工程等等,以后再说,有空了可以出一个ROS2工程实践系列)

这里我们还是从 CMakeLists.txt 动手

这样干

# 判断是否为arm64系统  
message(STATUS "Checking if the system is aarch64...")  
if(CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)  
  message(STATUS "The system is aarch64!")  
  set(CAN_LIB libarm)  
else()  
  message(STATUS "The system is not aarch64.")  
  set(CAN_LIB lib)  
endif()

   

最后记得安装可执行文件

install(TARGETS cantest
  RUNTIME DESTINATION lib/${PROJECT_NAME}   
)
 

### ROS2CMakeLists.txt 的配置示例 在 ROS2 项目中,`CMakeLists.txt` 文件用于描述如何构建软件包以及其依赖关系。以下是基于 ROS2 特性的 `CMakeLists.txt` 配置示例及其说明。 #### 基本结构 ```cmake cmake_minimum_required(VERSION 3.5) project(my_ros2_package) # 查找必要的 ROS2 软件包 find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) # 寻找 rclcpp 库支持[^5] # 定义可执行文件 add_executable(talker src/talker.cpp) # 将目标链接到所需的库 target_link_libraries(talker rclcpp) # 设置头文件路径 target_include_directories(talker PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) # 添加安装规则 install(TARGETS talker DESTINATION lib/${PROJECT_NAME}) # 测试部分(如果需要) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) ament_export_dependencies(ament_cindex_check) endif() # 结束并生成构建系统 ament_package() ``` --- #### 关键点解析 1. **设置最低版本** - 使用 `cmake_minimum_required(VERSION X.X)` 来声明使用的最小 CMake 版本。对于 ROS2,默认推荐使用 CMake 3.5 或更高版本[^3]。 2. **查找必要组件** - `find_package()` 函数用于定位所需模块或库。例如,在 ROS2 中,`rclcpp` 是核心客户端库之一,必须通过此命令引入[^5]。 3. **定义可执行文件** - 使用 `add_executable()` 创建一个可执行程序,并将其源码指向特定位置。这里假设有一个名为 `talker.cpp` 的节点实现文件。 4. **链接库** - 利用 `target_link_libraries()` 把编译好的二进制文件与外部库连接起来。此处将 `talker` 绑定至 `rclcpp` 库[^2]。 5. **管理包含目录** - 若项目中有自定义头文件,则需调用 `target_include_directories()` 明确指出这些资源的位置。这一步有助于解决可能存在的路径冲突问题[^4]。 6. **测试框架集成 (可选)** - 当启用单元测试功能时 (`BUILD_TESTING`) ,可以加载额外工具链如 lint 工具集来验证代码质量[^1]。 7. **最终打包指令** - 调用 `ament_package()` 表明当前工作已完成,准备进入下一步骤即实际部署阶段。 --- ### 注意事项 - 确保所有第三方依赖项均已正确定位并通过 `find_package()` 加载成功;否则可能导致后续操作失败。 - 对于复杂工程而言,建议单独维护一份清晰易读的文档记录每步逻辑含义以便后期维护人员快速理解整体架构设计思路。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值