执行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