【问题标题】:ROS Linking errors using boost::filesystem library using C++ under linuxROS Linking errors using boost::filesystem library using C++ under linux
【发布时间】:2012-08-04 12:26:43
【问题描述】:

我收到以下错误:

CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `boost::filesystem3::path::codecvt()':
/usr/include/boost/filesystem/v3/path.hpp:377: undefined reference to `boost::filesystem3::path::wchar_t_codecvt_facet()'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `directory_iterator':
/usr/include/boost/filesystem/v3/operations.hpp:594: undefined reference to `boost::filesystem3::detail::directory_iterator_construct(boost::filesystem3::directory_iterator&, boost::filesystem3::path const&, boost::system::error_code*)'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `boost::filesystem3::path::codecvt()':
/usr/include/boost/filesystem/v3/path.hpp:377: undefined reference to `boost::filesystem3::path::wchar_t_codecvt_facet()'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `path<boost::filesystem3::directory_entry>':
/usr/include/boost/filesystem/v3/path.hpp:134: undefined reference to `boost::filesystem3::path_traits::dispatch(boost::filesystem3::directory_entry const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::codecvt<wchar_t, char, __mbstate_t> const&)'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `is_directory':
/usr/include/boost/filesystem/v3/operations.hpp:223: undefined reference to `boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `boost::iterator_facade<boost::filesystem3::directory_iterator, boost::filesystem3::directory_entry, boost::single_pass_traversal_tag, boost::filesystem3::directory_entry&, int>::operator++()':
/usr/include/boost/filesystem/v3/operations.hpp:630: undefined reference to `boost::filesystem3::detail::directory_iterator_increment(boost::filesystem3::directory_iterator&, boost::system::error_code*)'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `boost::filesystem3::path::codecvt()':
/usr/include/boost/filesystem/v3/path.hpp:377: undefined reference to `boost::filesystem3::path::wchar_t_codecvt_facet()'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `is_directory':
/usr/include/boost/filesystem/v3/operations.hpp:223: undefined reference to `boost::filesystem3::detail::status(boost::filesystem3::path const&, boost::system::error_code*)'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `~dir_itr_imp':
/usr/include/boost/filesystem/v3/operations.hpp:563: undefined reference to `boost::filesystem3::detail::dir_itr_close(void*&, void*&)'
/usr/include/boost/filesystem/v3/operations.hpp:563: undefined reference to `boost::filesystem3::detail::dir_itr_close(void*&, void*&)'
CMakeFiles/ndt_visualiser.dir/src/fromFile.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'

我看过很多帖子都有类似的错误。在几乎所有这些帖子(例如Linking Boost Library in Linux)中,似乎解决方案是,您需要添加 -lboost_filesystem 和 -lboost_system 标志。我尝试将这些作为 lflags 或 cflags 添加到 manifest.xml 中,但这完全没有改变。我已经尝试在我的包的 CMakeLists.txt 中添加一些内容,但我想我做错了。

有什么想法吗?

【问题讨论】:

  • 我不确定 CMake 如何处理库,但通常链接器希望它们的输入文件以反向依赖顺序排列。因此,如果文件 A 包含取决于库 L 的代码,则链接时 L 必须在 A 之后。
  • 您是否安装了boost_filesystemlibboost-filesystem-devlibboost-all-dev
  • 是的。我有,我已经试过了:)

标签: c++ boost linker ros


【解决方案1】:

您需要在 CMakeLists.txt 中添加如下行:

rosbuild_add_boost_directories()
rosbuild_link_boost(ndt_visualizer filesystem system)

有关更多详细信息,请参阅http://www.ros.org/wiki/rosbuild/CMakeLists#rosbuild_link_boost

在清单中的 lflags 或 cflags 中添加行会影响链接到你的其他包,而不是你链接到其他的包。

未来,ROS 问题最好通过ROS AnswersSupport Guidelines 提出

【讨论】:

    【解决方案2】:

    作为一个小的后续行动,我遇到了对涉及文件状态和错误代码的未定义引用的问题。

    问题在于排序库链接(“较少依赖”的库出现在“较多依赖”的库之后,至少在 GCC 中是这样)。我的项目使用了一个依赖于 Boost.Filesystem 和 yaml-cpp 的自定义库。之前,我在 boost 库之后链接了我的自定义库,但那不起作用。我必须通过确保事后链接提升来修复它:

    rosbuild_add_boost_directories()
    rosbuild_add_executable(${PROJECT_NAME} ${SRCS})
    target_link_libraries(${PROJECT_NAME} custom_lib yaml-cpp)
    rosbuild_link_boost(${PROJECT_NAME} filesystem system)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多