利用msg生成头文件时,ROS编译报错:XXX/XXX.h: No such file or directory

问题:ROS中利用msg文件自动生成头文件未成功,编译报错

利用msg自动生成的头文件是在/devel/include里面(如果自己的头文件不在/devel/include里面,那CMakeList.txt和package.xml里面的配置一定要对应)

一、CMakeLists.txt关键配置

1.指定消息文件文件名与自己的文件对应

# 指定消息文件
add_message_files(
  FILES
  gps_data.msg
)

2、配置头文件路径

# 包含生成的头文件路径
include_directories(
  #include                    #ROS包下include文件夹路径
  ${catkin_INCLUDE_DIRS}      #包含std_msg.h等头文件目录
  ${CATKIN_DEVEL_PREFIX}/include  # 包含 devel/include 目录
)

(1)第一条指令include,是指包下的include文件夹,一般用于存放,自己编写的头文件,因为我没有自己写的头文件,所以这里我第一条指令注释了

(2)第二条指令是把std_msg.h等头文件路径包含进去

(3)第三条指令,利用msg自动生成的头文件是存放在/devel/include下,所以将其路径包含进去。

3、声明包的依赖关系

catkin_package(
  CATKIN_DEPENDS message_runtime std_msgs
  #INCLUDE_DIRS include ${CATKIN_DEVEL_PREFIX}/include  # 确保包含路径
  INCLUDE_DIRS ${CATKIN_DEVEL_PREFIX}/include
)

这个指令里面的路径需要和上面对应,因为上面我包含的路径是/devel/include,所以我的路径设置的是第三条指令,如果你上面包含的是ROS包下的include文件夹和/devel/include文件夹,那就用第二条指令,为啥不需要包含 ${catkin_INCLUDE_DIRS} 这个的路径呢?我不知道,据说这个路径省略不写。

二、package.xml配置

package.xml文件中需要包含对message_generation和message_runtime的依赖

message_generation
message_generation
message_runtime

三、进入工作空间,重现编译(默认roscore了)

cd ~/workspace_name        #进入工作空间
source devel/setup.bash    #配置环境
catkin_make                 #全部重新编译
catkin_make --pkg  package_name   #只编译package_name包

四、还是报错

可能是消息生成、依赖配置或编译顺序的问题

1.检查生成路径

ls ~/ros_ws/devel/include/gps/

2.编译顺序

cd ~/ros_ws
catkin_make --cmake-args -DCATKIN_WHITELIST_PACKAGES="gps"

devel/include/gps文件下应该生成了对应的头文件。

你可能感兴趣的:(ROS,机器人)