ROS编译cpp,补充缺失头文件

ROS系统编译cpp报错,如下。

/home/will/catkin_ws/src/gazebo_base20/src/odometry_publisher.cpp:1:10: fatal error: ros/ros.h: No such file or directory
 #include <ros/ros.h>
          ^~~~~~~~~~~
compilation terminated.
gazebo_base20/CMakeFiles/odometry_publisher.dir/build.make:62: recipe for target 'gazebo_base20/CMakeFiles/odometry_publisher.dir/src/odometry_publisher.cpp.o' failed
make[2]: *** [gazebo_base20/CMakeFiles/odometry_publisher.dir/src/odometry_publisher.cpp.o] Error 1
CMakeFiles/Makefile2:500: recipe for target 'gazebo_base20/CMakeFiles/odometry_publisher.dir/all' failed
make[1]: *** [gazebo_base20/CMakeFiles/odometry_publisher.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j8 -l8" failed

没有成功添加ros的头文件。
打开自己的package,打开CMakeLists.txt,添加:

include_directories(${catkin_INCLUDE_DIRS})

即可,完整的事例:

cmake_minimum_required(VERSION 2.8.3)

project(gazebo_base20)

find_package(catkin REQUIRED COMPONENTS nav_msgs roscpp rospy tf)

catkin_package()

include_directories(${catkin_INCLUDE_DIRS})

foreach(dir config launch meshes urdf)
	install(DIRECTORY ${dir}/
		DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/${dir})
endforeach(dir)

add_executable(odometry_publisher src/odometry_publisher.cpp)
if(nav_msgs_EXPORTED_TARGETS)
  add_dependencies(odometry_publisher ${nav_msgs_EXPORTED_TARGETS})
endif()
target_link_libraries(odometry_publisher ${catkin_LIBRARIES})

遇到此类问题,显示缺什么头文件,而自己却又可以在系统中搜索到相应的头文件,这样就很好办,只要指明正确的路径即可。

大致流程:
如我要调用新版fcl的头文件,因为ros会自带一个版本,但是新版的用得更多,API不一样了。所以要调用新的fcl头文件,就需要重新指定路径。

1) 先设定各种头文件所在的绝对路径
如果不知道自己有没有对应的头文件,可以通过指令定位:
locate xxx.h
然后把对应的绝对路径输入CMakeLists.txt

set(
  fcl_INCLUDE_DIRS
  "/home/will/Package/fcl/include"
  "/home/will/Package/fcl/build/include" 
  "/home/will/Package/fcl/test"
  "/home/will/Package/fcl/build/test"
) 

其中fcl_INCLUDE_DIRS是指向它后面所有的路径的指针,这个名字可以自己取。

2) 调用上面定义的名字,加到头文件调用的指令中

include_directories(
 include_directories
 ${catkin_INCLUDE_DIRS}
 ${fcl_INCLUDE_DIRS}
)

3)此时再次编译,就可以发现,不会再报头文件缺失的错了
特别注意的是,有些代码中,copy了别人的代码,别人可能指定头文件时,写的是相对路径,这时要注意修改,在写绝对路径时只需要写到对应相对路径的上一级即可,如下:
假设要调用test.h 头文件,它保存在/home/will/fcl/test/中,一般各种包的头文件保存在/usr/include/中,别人调用时可能写的是

 #include <test/test.h>

我们在添加自定义路径时,写成如下形式即可:

set(
 fcl_INCLUDE_DIRS
 "/home/will/fcl/include"
) 

不用写到test文件夹,这样反而搜索不到

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值