boost::program_options 的链接错误

linking error for boost::program_options

我无法找出使用 boost::program_options 的 linking 错误。这是一个示例 C++ 代码:

# sample_code.cpp
#include <boost/program_options.hpp>
int main()
{
    boost::program_options::options_description description("Test");
}

我还在 Yosemite 10.10.2 上使用 MacPorts 安装了 boost 1.57.0。这是相关的图书馆:

/opt/local/lib/libboost_program_options-mt.a

让我们编译并link这段代码:

alias g++='/opt/local/bin/g++-mp-5 -std=gnu++14 -I/opt/local/include -L/opt/local/lib'

g++ sample_code.cpp -lboost_program_options-mt

并且在 linking 期间失败:

Undefined symbols for architecture x86_64:
"boost::program_options::options_description::options_description(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)"
ld: symbol(s) not found for architecture x86_64

有什么想法吗?

正如 Petesh 在上面的评论中指出的那样,问题出在 MacPorts 如何使用 clang++ 而不是 g++ 构建 boost 而不是 g++

遗憾的是,MacPorts 不为 boost!

提供任何 gcc 内置变体

解决办法很简单:你必须使用相同版本的编译器(或者至少它们应该兼容)来编译boost 和你的程序。当我的 boost 是用 GCC 4.8.3 编译的,而我的代码是用 GCC 5.3.0 编译的时,我遇到了链接错误。使用 GCC 5.3.0 构建 boost 后,链接问题消失了。