tf_listener编译失败,undefined reference to 'ros:: ……'

本文详细记录了解决ROS中tf_listener编译错误的过程,通过调整CMakeLists.txt文件,正确链接tf库,最终成功编译tf_listener和tf_broadcaster两个可执行文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行catkin_make命令后,出现如下报错:

[ 25%] Linking CXX executable tf_listener
CMakeFiles/tf_listener.dir/src/tf_listener.cpp.o: In function `transformPoint(tf::TransformListener const&)':
tf_listener.cpp:(.text+0xe2): undefined reference to `tf::TransformListener::transformPoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::PointStamped_<std::allocator<void> > const&, geometry_msgs::PointStamped_<std::allocator<void> >&) const'
tf_listener.cpp:(.text+0x107): undefined reference to `ros::console::g_initialized'
tf_listener.cpp:(.text+0x117): undefined reference to `ros::console::initialize()'
tf_listener.cpp:(.text+0x170): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::console::levels::Level)'
tf_listener.cpp:(.text+0x1b3): undefined reference to `ros::console::setLogLocationLevel(ros::console::LogLocation*, ros::console::levels::Level)'
tf_listener.cpp:(.text+0x1bf): undefined reference to `ros::console::checkLogLocationEnabled(ros::console::LogLocation*)'
tf_listener.cpp:(.text+0x276): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, char const*, int, char const*, char const*, ...)'
tf_listener.cpp:(.text+0x348): undefined reference to `ros::console::g_initialized'
tf_listener.cpp:(.text+0x358): undefined reference to `ros::console::initialize()'
tf_listener.cpp:(.text+0x3ab): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::console::levels::Level)'
tf_listener.cpp:(.text+0x3eb): undefined reference to `ros::console::setLogLocationLevel(ros::console::LogLocation*, ros::console::levels::Level)'
tf_listener.cpp:(.text+0x3f7): undefined reference to `ros::console::checkLogLocationEnabled(ros::console::LogLocation*)'
tf_listener.cpp:(.text+0x46f): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, char const*, int, char const*, char const*, ...)'
CMakeFiles/tf_listener.dir/src/tf_listener.cpp.o: In function `main':
tf_listener.cpp:(.text+0x54d): undefined reference to `ros::init(int&, char**, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)'
tf_listener.cpp:(.text+0x5df): 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&)'
tf_listener.cpp:(.text+0x640): undefined reference to `tf::TransformListener::TransformListener(ros::Duration, bool)'
tf_listener.cpp:(.text+0x6fb): undefined reference to `ros::NodeHandle::createTimer(ros::Duration, boost::function<void (ros::TimerEvent const&)> const&, bool, bool) const'
tf_listener.cpp:(.text+0x71e): undefined reference to `ros::spin()'
tf_listener.cpp:(.text+0x72d): undefined reference to `ros::Timer::~Timer()'
tf_listener.cpp:(.text+0x73c): undefined reference to `tf::TransformListener::~TransformListener()'
tf_listener.cpp:(.text+0x74b): undefined reference to `ros::NodeHandle::~NodeHandle()'
tf_listener.cpp:(.text+0x813): undefined reference to `ros::Timer::~Timer()'
tf_listener.cpp:(.text+0x827): undefined reference to `tf::TransformListener::~TransformListener()'
tf_listener.cpp:(.text+0x83b): undefined reference to `ros::NodeHandle::~NodeHandle()'
CMakeFiles/tf_listener.dir/src/tf_listener.cpp.o: In function `__static_initialization_and_destruction_0(int, int)':
tf_listener.cpp:(.text+0x8bc): undefined reference to `boost::system::generic_category()'
tf_listener.cpp:(.text+0x8c8): undefined reference to `boost::system::generic_category()'
tf_listener.cpp:(.text+0x8d4): undefined reference to `boost::system::system_category()'
CMakeFiles/tf_listener.dir/src/tf_listener.cpp.o: In function `ros::Duration::Duration(double)':
tf_listener.cpp:(.text._ZN3ros8DurationC2Ed[_ZN3ros8DurationC5Ed]+0x33): undefined reference to `ros::DurationBase<ros::Duration>::fromSec(double)'
CMakeFiles/tf_listener.dir/src/tf_listener.cpp.o: In function `boost::system::error_category::std_category::equivalent(int, std::error_condition const&) const':
tf_listener.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition[_ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition]+0xb8): undefined reference to `boost::system::generic_category()'
tf_listener.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition[_ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition]+0xf3): undefined reference to `boost::system::generic_category()'
CMakeFiles/tf_listener.dir/src/tf_listener.cpp.o: In function `boost::system::error_category::std_category::equivalent(std::error_code const&, int) const':
tf_listener.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0xb8): undefined reference to `boost::system::generic_category()'
tf_listener.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0xf3): undefined reference to `boost::system::generic_category()'
tf_listener.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0x1d2): undefined reference to `boost::system::generic_category()'
collect2: error: ld returned 1 exit status
robot_setup_tf/CMakeFiles/tf_listener.dir/build.make:94: recipe for target 'robot_setup_tf/tf_listener' failed
make[2]: *** [robot_setup_tf/tf_listener] Error 1
CMakeFiles/Makefile2:1053: recipe for target 'robot_setup_tf/CMakeFiles/tf_listener.dir/all' failed
make[1]: *** [robot_setup_tf/CMakeFiles/tf_listener.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j4 -l4" failed

网上查到2种类似情况的解决办法:1.修改CMakeLists.txt,target_link_libraries(tf_listener ${catkin_LIBRARIES})中的catkin_LIBRARIES不可以用小写字母catkin_libraries;2.修改CMakeLists.txt,在find_package(catkin REQUIRED COMPONENTS)中添加tf,如:find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp

  ... ...
  tf
)

检查了我的CMakeLists.txt,满足上述两点,问题未解决,但是觉得应该是CMakeLists.txt有问题。我把find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp
  tf
)复制到了project(hello_tf)后面,并且在后面添加了catkin_package(),如:

cmake_minimum_required(VERSION 2.8.3)
project(robot_setup_tf)
##lixue add
find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp
  tf
)
catkin_package()
add_executable(tf_broadcaster src/tf_broadcaster.cpp)
add_executable(tf_listener src/tf_listener.cpp)
target_link_libraries(tf_broadcaster ${catkin_LIBRARIES})
target_link_libraries(tf_listener ${catkin_LIBRARIES})


再次编译后通过,问题解决

[ 25%] Linking CXX executable /home/lx/ROS/hellotf/devel/lib/robot_setup_tf/tf_listener
[ 50%] Built target tf_listener
Scanning dependencies of target tf_broadcaster
[ 75%] Building CXX object robot_setup_tf/CMakeFiles/tf_broadcaster.dir/src/tf_broadcaster.cpp.o
[100%] Linking CXX executable /home/lx/ROS/hellotf/devel/lib/robot_setup_tf/tf_broadcaster
[100%] Built target tf_broadcaster

 

 

/usr/bin/ld: CMakeFiles/turtle_listener.dir/src/turtle_listener.cpp.o: in function `main': turtle_listener.cpp:(.text+0x31b): undefined reference to `tf::Transformer::DEFAULT_CACHE_TIME' /usr/bin/ld: turtle_listener.cpp:(.text+0x34d): undefined reference to `tf::TransformListener::TransformListener(ros::Duration, bool)' /usr/bin/ld: turtle_listener.cpp:(.text+0x43b): undefined reference to `tf::Transformer::lookupTransform(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&, ros::Time const&, tf::StampedTransform&) const' /usr/bin/ld: turtle_listener.cpp:(.text+0x5bc): undefined reference to `tf::TransformListener::~TransformListener()' /usr/bin/ld: turtle_listener.cpp:(.text+0x91f): undefined reference to `tf::TransformListener::~TransformListener()' collect2: error: ld returned 1 exit status make[2]: *** [turtle_follow/CMakeFiles/turtle_listener.dir/build.make:101:/home/wang/test3/devel/lib/turtle_follow/turtle_listener] 错误 1 make[1]: *** [CMakeFiles/Makefile2:746:turtle_follow/CMakeFiles/turtle_listener.dir/all] 错误 2 make[1]: *** 正在等待未完成的任务.... /usr/bin/ld: CMakeFiles/turtle_broadcaster.dir/src/turtle_broadcaster.cpp.o: in function `poseCallback(boost::shared_ptr<turtlesim::Pose_<std::allocator<void> > const> const&)': turtle_broadcaster.cpp:(.text+0x7a): undefined reference to `tf::TransformBroadcaster::TransformBroadcaster()' /usr/bin/ld: turtle_broadcaster.cpp:(.text+0x234): undefined reference to `tf::TransformBroadcaster::sendTransform(tf::StampedTransform const&)' collect2: error: ld returned 1 exit status make[2]: *** [turtle_follow/CMakeFiles/turtle_broadcaster.dir/build.make:101:/home/wang/test3/devel/lib/turtle_follow/turtle_broadcaster] 错误 1 make[1]: *** [CMakeFiles/Makefile2:449:turtle_follow/CMakeFiles/turtle_broadcaster.dir/all] 错误 2 make: *** [Makefile:141:all] 错误 2 Invoking "make -j4 -l4" failed
最新发布
03-21
/usr/bin/ld: CMakeFiles/global_planning_node.dir/src/global_planning_node.cpp.o: in function main.cold': global_planning_node.cpp:(.text.unlikely+0x273): undefined reference to tf::TransformListener::~TransformListener()' /usr/bin/ld: CMakeFiles/global_planning_node.dir/src/global_planning_node.cpp.o: in function main': global_planning_node.cpp:(.text.startup+0xc64): undefined reference to tf::Transformer::DEFAULT_CACHE_TIME' /usr/bin/ld: global_planning_node.cpp:(.text.startup+0xc92): undefined reference to tf::TransformListener::TransformListener(ros::Duration, bool)' /usr/bin/ld: global_planning_node.cpp:(.text.startup+0xd7a): undefined reference to tf::Transformer::lookupTransform(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&, ros::Time const&, tf::StampedTransform&) const' /usr/bin/ld: global_planning_node.cpp:(.text.startup+0xe74): undefined reference to tf::TransformListener::~TransformListener()' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/global_planning_node.dir/build.make:246: /home/juan/catkin_ws/devel/.private/putn/lib/putn/global_planning_node] Error 1 make[1]: *** [CMakeFiles/Makefile2:207: CMakeFiles/global_planning_node.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... /usr/bin/ld: CMakeFiles/local_obs_node.dir/src/local_obs.cpp.o: in function rcvVelodyneCallBack(sensor_msgs::PointCloud2<std::allocator<void> > const&)': local_obs.cpp:(.text+0xa0b): undefined reference to tf::Transformer::waitForTransform(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&, ros::Time const&, ros::Duration const&, ros::Duration const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const' /usr/bin/ld: local_obs.cpp:(.text+0xc74): undefined reference to tf::TransformListener::transformPoint(std::cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::PointStamped<std::allocator<void> > const&, geometry_msgs::PointStamped<std::allocator<void> >&) const' /usr/bin/ld: CMakeFiles/local_obs_node.dir/src/local_obs.cpp.o: in function main.cold': local_obs.cpp:(.text.unlikely+0x37d): undefined reference to tf::TransformListener::~TransformListener()' /usr/bin/ld: CMakeFiles/local_obs_node.dir/src/local_obs.cpp.o: in function main':local_obs.cpp:(.text.startup+0x62a): undefined reference to tf::Transformer::DEFAULT_CACHE_TIME' /usr/bin/ld: local_obs.cpp:(.text.startup+0x64d): undefined reference to tf::TransformListener::TransformListener(ros::Duration, bool)' /usr/bin/ld: local_obs.cpp:(.text.startup+0x6dc): undefined reference to tf::TransformListener::~TransformListener()' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/local_obs_node.dir/build.make:246: /home/juan/catkin_ws/devel/.private/putn/lib/putn/local_obs_node] Error 1 make[1]: *** [CMakeFiles/Makefile2:612: CMakeFiles/local_obs_node.dir/all] Error 2 make: *** [Makefile:141: all] Error 2解释编译时出现这个问题的原因,并说说如何解决
07-10
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值