我项目的用户向我报告了此错误。我无法在我的计算机或实验室的服务器上重现它,所以我在这里问它。
该项目使用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,也与我的版本相同。
答案 0 :(得分:2)
在使用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 )