ROS 包的头文件 哪里找?

本文介绍如何在ROS环境中配置不同包之间的头文件引用。主要步骤包括在package.xml中添加依赖、CMakeLists.txt中使用find_package指定依赖包并设置正确的头文件路径。

catkin_make之后  再执行 catkin_make install ,生成个install的文件夹,就在里面了。。。

问题来了, 包之间的头文件怎么用呢?


catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件。否则会出现类似如下的错误:

 

/home/xx/xx_ws/srcA_package/src/db.hpp:13:26: fatal error: B_package/alax.h: No such file or directory

#include <B_package/alax.h>

这需要对包进行配置,假设包A_package需要引用B_package的头文件(例如由message,srv,action自动生成的头文件)。步骤如下:

 

1.在A_package包的package.xml中添加编译和运行的依赖库,如下:

<build_depend>B_package</build_depend>
<run_depend>B_package</run_depend>

2.在A_package包的CMakeList.txt中的find_package添加B_package如下:

find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs  B_package )

3.在A_package包的CMakeList.txt中的include_directories添加${catkin_INCLUDE_DIRS}如下:

include_directories(include ${catkin_INCLUDE_DIRS})
转自 https://www.cnblogs.com/cv-pr/p/6888464.html
### ROS2 自定义头文件 Include 路径配置解决方案 在 ROS2 项目中,如果遇到无法找到自定义头文件的问题,通常是因为 `CMakeLists.txt` 文件中的路径未正确配置。以下是详细的解决方法: #### 1. 确认头文件存储位置 确保所有的自定义头文件都存放在项目的 `include` 目录下。例如,在以下目录结构中[^3]: ``` ├── build ├── CMakeLists.txt ├── include │ ├── mainwindow.h │ └── rclcomm.h ├── package.xml ├── resource ├── src │ ├── main.cpp │ ├── mainwindow.cpp │ └── rclcomm.cpp └── ui └── mainwindow.ui ``` #### 2. 修改 `CMakeLists.txt` 的 Include 路径 为了使编译器能够识别这些头文件位置,需在 `CMakeLists.txt` 中添加如下内容: ```cmake # 设置当前的 include 路径 ament_export_include_directories(include) # 将 include 目录加入到构建过程中 include_directories( ${catkin_INCLUDE_DIRS} include ) ``` 上述代码的作用是告诉编译工具链将 `include` 目录作为查找头文件的一部分[^2]。 #### 3. 使用正确的头文件引入方式 当编写 `.cpp` 文件时,应按照标准的方式引入头文件。例如,假设有一个名为 `rclcomm.h` 的头文件位于 `include/` 下,则可以在对应的 `.cpp` 文件中这样写: ```cpp #include "your_package_name/rclcomm.h" ``` 这里的 `your_package_name` 是指当前 ROS2 的名字,这一步非常重要,因为 ROS2 编译系统会基于名来定位头文件所在位置[^5]。 #### 4. 处理多文件情况 如果有多个 `.h` 和 `.cpp` 文件需要管理,可以继续扩展 `CMakeLists.txt` 文件的内容。比如,对于多个源文件的情况,可以通过以下命令将其全部纳入编译过程: ```cmake add_executable(your_node_name src/main.cpp src/mainwindow.cpp src/rclcomm.cpp ) target_link_libraries(your_node_name PRIVATE ${ament_CMAKE_TARGET_LINK_LIBRARIES} your_custom_library_if_needed ) ``` 这里需要注意的是,所有参与编译的 `.cpp` 文件都需要显式列出。 #### 5. 添加额外依赖项(可选) 如果项目还涉及其他外部库或者消息类型的处理,可能还需要进一步调整 `CMakeLists.txt`。例如,假如使用了自定义的消息类型或服务接口,则需要像下面这样操作: ```cmake find_package(geometry_msgs REQUIRED) # 如果需要用到 geometry_msgs 类型的数据 rosidl_generate_interfaces(${PROJECT_NAME} "msg/YourCustomMsg.msg" DEPENDENCIES std_msgs geometry_msgs ) ``` 这段脚本用于声明所使用的各种消息和服务接口及其依赖关系。 通过以上步骤即可有效解决 ROS2 项目中找不到自定义头文件的问题,并实现良好的模块化开发体验。 --- ### 示例代码片段 以下是一个完整的 `CMakeLists.txt` 配置示例: ```cmake cmake_minimum_required(VERSION 3.5) project(example_project) # 找到必要的 ROS2 工具集 find_package(ament_cmake REQUIRED) find_package(rmw_implementation_cmake REQUIRED) # 导入特定功能 find_package(Qt5 COMPONENTS Widgets REQUIRED) find_package(geometry_msgs REQUIRED) # 定义目标执行文件 add_executable(main_node src/main.cpp src/mainwindow.cpp src/rclcomm.cpp) # 设定含路径 ament_export_include_directories(include) include_directories(include ${Qt5Widgets_INCLUDE_DIRS}) # 链接库 target_link_libraries(main_node PRIVATE Qt5::Widgets) target_link_libraries(main_node PRIVATE ${catkin_LIBRARIES}) # 安装部分 install(TARGETS main_node DESTINATION lib/${PROJECT_NAME}) install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION include/${PROJECT_NAME}) # 测试和打支持 ament_package() ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值