【问题标题】:unresolved symbols while linking boost program options链接升压程序选项时未解析的符号
【发布时间】:2013-08-08 06:58:05
【问题描述】:

我的项目的用户向我报告了此错误。我无法在我的计算机或我实验室的服务器上重现它,所以我在这里问它。

项目使用 CMake 生成构建环境。它使用 FindBoost 实用程序(随 CMake 提供)来查找 Boost 资源。

一开始,我的用户在链接最终程序时说,编译器提供了“/usr/lib64/lib64/libboost_XXX.so”,而不是正确的“/usr/lib64/libboost_XXX.so”。我没找到为什么 CMake 会生成这么奇怪的库位置,并要求他手动设置变量 Boost_LIBRARIES,并打印出来:

Boost libraries are: /usr/lib64/libboost_thread-mt.so;/usr/lib64/libboost_program_options-mt.so;/usr/lib64/libboost_filesystem-mt.so

事情似乎是正确的。编译成功。但是在进行链接时,程序会为许多未定义的符号哭泣:

CMakeFiles/ht-filter.dir/ht-filter.cpp.o: In function `parse_options(int, char**)':
/public/home/yli/Downloads/htqc-0.15.0-Source/ht-filter.cpp:43: undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)'
......
/usr/local/include/boost/program_options/errors.hpp:372: undefined reference to `boost::program_options::validation_error::get_template(boost::program_options::validation_error::kind_t)'

这是众多错误中的两个典型错误:一个来自我的源代码,另一个来自 boost 的标头。在我的源代码的对应行中,我刚刚创建了 options_description 对象

// I renamed boost::program_options to opt
opt::options_description opt_main("Options:");

我的用户的操作系统是 CentOS 6.2,他的 Boost 版本是 1.50.0,和我电脑里的类似。我的用户的CMake版本是2.8.11,和我的一样。

【问题讨论】:

  • 也许您的用户安装了 2 个版本的 boost,或者 1 个版本和另一个版本的一些“剩余”?

标签: c++ cmake boost-program-options


【解决方案1】:

在使用 CMake 的 find_package 进行 Boost 时,您可以给 CMake 一些提示,这可能有助于它找到正确的库,例如:

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

set(BOOST_ROOT "/usr")

find_package(Boost 1.50.0)

message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
message(STATUS "Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}")

此外,如果您要与动态库链接,请确保让 Boost 标头知道它(我认为您不应该在这里弄乱顺序):

link_directories(${Boost_LIBRARY_DIRS})

include_directories(${Boost_INCLUDE_DIRS})

add_definitions( -DBOOST_ALL_DYN_LINK )

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2016-01-19
    • 1970-01-01
    • 2012-07-29
    • 2016-12-12
    • 1970-01-01
    • 2018-08-29
    • 2014-02-14
    • 2016-08-26
    相关资源
    最近更新 更多