编译ROS工程的时候遇到找不到ros头文件的问题

在编译自己写的头文件的时候,有时候会遇到找不到ros头文件,ros消息的问题,大致如下:

CMakeFiles/tom_odometry.dir/src/tom_odometry.cpp.o: In function `main':
tom_odometry.cpp:(.text+0x72): undefined reference to `ros::init(int&, char**, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)'
tom_odometry.cpp:(.text+0x104): undefined reference to `ros::NodeHandle::NodeHandle(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)'
tom_odometry.cpp:(.text+0x1b9): undefined reference to `ros::Rate::Rate(double)'
tom_odometry.cpp:(.text+0x1ca): undefined reference to `ros::ok()'
tom_odometry.cpp:(.text+0x250): undefined reference to `ros::Time::now()'
tom_odometry.cpp:(.text+0x640): undefined reference to `ros::Rate::sleep()'
tom_odometry.cpp:(.text+0x6b0): undefined reference to `ros::Publisher::~Publisher()'
tom_odometry.cpp:(.text+0x6bf): undefined reference to `ros::NodeHandle::~NodeHandle()'
tom_odometry.cpp:(.text+0x7c3): undefined reference to `ros::Publisher::~Publisher()'
tom_odometry.cpp:(.text+0x7d2): undefined reference to `ros::NodeHandle::~NodeHandle()'
CMakeFiles/tom_odometry.dir/src/tom_odometry.cpp.o: In function `ros::Publisher ros::NodeHandle::advertise<visualization_msgs::Marker_<std::allocator<void> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, bool)':
tom_odometry.cpp:(.text._ZN3ros10NodeHandle9advertiseIN18visualization_msgs7Marker_ISaIvEEEEENS_9PublisherERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjb[_ZN3ros10NodeHandle9advertiseIN18visualization_msgs7Marker_ISaIvEEEEENS_9PublisherERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjb]+0xdd): undefined reference to `ros::NodeHandle::advertise(ros::AdvertiseOptions&)'
CMakeFiles/tom_odometry.dir/src/tom_odometry.cpp.o: In function `void ros::Publisher::publish<visualization_msgs::Marker_<std::allocator<void> > >(visualization_msgs::Marker_<std::allocator<void> > const&) const':
tom_odometry.cpp:(.text._ZNK3ros9Publisher7publishIN18visualization_msgs7Marker_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN18visualization_msgs7Marker_ISaIvEEEEEvRKT_]+0x47): undefined reference to `ros::console::g_initialized'

遇到这类问题基本都是CMakeLists或者package.xml文件中缺少包含对应的库或者依赖项,主要检查以下几点:

CmakeLists:

  1. find_package()
  2. catkin_package()
  3. include_directories()
  4. add_executable()
  5. target_link_libraries() -> 这点容易忽略

package.xml

  1. <build_depend>xxx</build_depend>
  2. <build_export_depend>xxx</build_export_depend>
  3. <exec_depend>xxx</exec_depend>
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这种情况可能是由于头文件的路径没有正确设置导致的。你可以尝试以下几个步骤来解决问题: 1. 确认头文件路径是否正确 在编译时,需要将头文件的路径添加到编译器的搜索路径中。你可以在 Makefile 或 CMakeLists.txt 文件中到类似于 `INCLUDE_DIRECTORIES` 或 `INCLUDE_PATH` 的设置,确认头文件路径是否正确。如果你使用的是 ROS,可以尝试通过以下命令来查看系统中是否存在所需的头文件: ``` rospack find [package_name] ``` 其中,`package_name` 是需要查头文件ROS 包的名称。 2. 检查头文件是否缺失 如果编译器提示不到某个头文件,可能是这个头文件没有安装或者没有包含在项目中。你可以尝试通过以下命令来查系统中是否存在所需的头文件: ``` sudo apt-file search [header_file_name] ``` 其中,`header_file_name` 是需要查头文件的名称。 3. 检查头文件之间的依赖关系 如果头文件之间存在相互依赖的关系,可能会导致编译器无法到某个头文件。你可以尝试通过在头文件中添加预处理指令来解决依赖关系问题,例如: ```c++ #ifndef _HEADER_FILE_A_ #define _HEADER_FILE_A_ // Header file A 的内容 #endif /* _HEADER_FILE_A_ */ #ifndef _HEADER_FILE_B_ #define _HEADER_FILE_B_ // Header file B 的内容 #endif /* _HEADER_FILE_B_ */ ``` 在这个例子中,如果头文件 A 依赖于头文件 B,那么在 A 的头文件中添加 `#include "header_file_b.h"` 可能会导致头文件依赖关系错误。为了解决这个问题,我们可以在两个头文件中都添加上面的预处理指令,这样如果头文件 B 已经被包含了,那么头文件 A 就不会再次包含它了。 希望这些方法能够帮助你解决问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值