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
文件夹,这样反而搜索不到