首页 > 解决方案 > Catkin 构建在构建时失败。未定义对 YAML 错误的引用

问题描述

我在尝试构建项目时收到以下错误。

Errors     << lifelong_learning:make /home/ekin/my_ws/logs/lifelong_learning/build.make.001.log                                                                                                           
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `vtable for YAML::InvalidNode'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::begin()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::LoadAllFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::~Emitter()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `typeinfo for YAML::BadConversion'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::BadConversion::~BadConversion()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::PrepareNode(YAML::EmitterNodeType::value)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `typeinfo for YAML::BadSubscript'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::GetFloatPrecision() const'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `vtable for YAML::RepresentationException'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::SetLocalValue(YAML::EMITTER_MANIP)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::StartedScalar()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::InvalidNode::~InvalidNode()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::ostream_wrapper::write(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::memory::create_node()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::size() const'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `vtable for YAML::BadSubscript'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::set_null()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::set_scalar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::end()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::insert_map_pair(YAML::detail::node&, YAML::detail::node&)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `typeinfo for YAML::InvalidNode'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::Emitter()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::convert_to_map(std::shared_ptr<YAML::detail::memory_holder>)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `vtable for YAML::Exception'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `vtable for YAML::BadConversion'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::empty_scalar[abi:cxx11]'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::memory_holder::merge(YAML::detail::memory_holder&)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::good() const'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::c_str() const'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::BadSubscript::~BadSubscript()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::mark_defined()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/learning_node_segmentation.dir/build.make:468: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/lifelong_learning/learning_node_segmentation] Error 1
make[1]: *** [CMakeFiles/Makefile2:1422: CMakeFiles/learning_node_segmentation.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `vtable for YAML::InvalidNode'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::detail::node_data::begin()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::LoadAllFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `YAML::Emitter::~Emitter()'
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `typeinfo for YAML::BadConversion'
...
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/learning_node_update_locm.dir/build.make:467: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/lifelong_learning/learning_node_update_locm] Error 1
make[1]: *** [CMakeFiles/Makefile2:1530: CMakeFiles/learning_node_update_locm.dir/all] Error 2
/usr/bin/ld: /home/ekin/my_ws/devel/.private/lifelong_learning/lib/liblearninglib.so.0.0.1: undefined reference to `vtable for YAML::InvalidNode'
...
make: *** [Makefile:141: all] Error 2

我的 CMake 文件包括以下内容

#Yaml
find_package(yaml-cpp)
#Project Executables(Nodes)
add_executable(learning_node_diagnostics 
 src/learning_node_diagnostics.cpp
)
target_include_directories(learning_node_diagnostics PRIVATE include)
target_link_libraries(learning_node_diagnostics PUBLIC 
learninglib
${PCL_LIBRARIES}
${catkin_LIBRARIES}
${OpenCV_LIBS}
${YAML_CPP_LIBRARIES}
)
...

而且我还尝试了以下作为我的 CMake 文件并得到了同样的错误

find_package(PkgConfig)
pkg_check_modules(YAMLCPP REQUIRED yaml-cpp>=0.5)
include_directories(${YAMLCPP_INCLUDE_DIRS})

add_executable(name src/name.cpp)
target_link_libraries(name ${catkin_LIBRARIES}  ${YAMLCPP_LIBRARIES})

我也尝试过以下 CMake 文件

#Yaml
find_package(yaml-cpp REQUIRED)
target_link_libraries(name ${catkin_LIBRARIES}  yaml-cpp)

它们似乎都不起作用,我知道该项目是在其他计算机中构建的,并且 yaml 似乎可以在我的计算机上使用 moveit api 正常工作。我已经尝试重新安装 ROS Noetic,但它仍然无法正常工作。这个时候我能做什么。我使用的是 Ubuntu 20.04,并且安装了 ROS Noetic 发行版。

标签: c++ubuntuyamlundefined-referencebuild-error

解决方案


推荐阅读