【问题标题】:undefined reference to boost::program_options in xubuntuxubuntu 中对 boost::program_options 的未定义引用
【发布时间】:2017-01-28 04:47:30
【问题描述】:

我有这个文件

#include <boost/program_options.hpp>
namespace po = boost::program_options;

#include <iostream>
using namespace std;

int main(int ac, char* av[])
{
    try {

    po::options_description desc("Allowed options");
        desc.add_options()
            ("help", "produce help message")
        ;

    }
    catch(exception& e) {
        cerr << "error: " << e.what() << "\n";
        return 1;
    }
    catch(...) {
        cerr << "Exception of unknown type!\n";
    }

    return 0;
}

现在我尝试这样编译:

g++ -I /usr/include/boost/ -I /usr/include/boost/program_options main.cpp -L /usr/lib/x86_64-linux-gnu/ -lboost_program_options

我收到了这个

未定义的引用 `boost::program_options::options_description::options_description(std::__cxx11::basic_string, std::allocator > const&, unsigned int, 无符号整数)'

我不知道它为什么会失败,库在那里,头文件也在那里。出了什么问题?我正在使用 boost 1.55.0

administrator@administrator-VirtualBox:~/l/b$ sudo updatedb
administrator@administrator-VirtualBox:~/l/b$ locate libboost_program_options
/usr/lib/x86_64-linux-gnu/libboost_program_options.a
/usr/lib/x86_64-linux-gnu/libboost_program_options.so
/usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.55.0

【问题讨论】:

  • 你能先写一个sudo updatedb,然后写一个locate libboost_program_options,然后粘贴后者的结果吗?
  • 请查看更新后的问题
  • 看起来不错。对不起,我不知道。祝你好运。

标签: c++ c++11 boost


【解决方案1】:

看起来 boost 是用 pre-C++11 std::basic_string 编译的,而你的代码是用 C++11 std::basic_string 编译的。

尝试使用-D_GLIBCXX_USE_CXX11_ABI=0 编译器命令行选项重新编译您的代码。详情请见GCC5 and the C++11 ABI

在大多数情况下,由于链接器的错误抱怨涉及__cxx11 的未解析符号,因此需要此标志时很明显。

【讨论】:

  • 另一种解决方法是在编译 gcc/g++ 时提供--with-default-libstdcxx-abi=gcc4-compatible
猜你喜欢
  • 2012-08-24
  • 2017-09-05
  • 2020-09-08
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多