c++ - boost 程序选项不适用于 GLIBCXX_DEBUG

标签 c++ boost linker g++ boost-program-options

我有以下示例代码:

#include <iostream>
#include <boost/program_options.hpp>

int main ( int ac, char *av[] ) {
    // Declare the supported options.
    boost::program_options::options_description desc("Allowed options");
    desc.add_options()("help", "produce help message");

    boost::program_options::variables_map vm;
    boost::program_options::store(boost::program_options::parse_command_line(ac, av, desc), vm);
    return 0;
}

它可以很好地编译使用例如g++ test.cpp -lboost_program_options . 但是,如果我尝试通过调用激活 GCC 边界检查 g++ test.cpp -lboost_program_options -D_GLIBCXX_DEBUG ,它会引发以下链接器错误:

/tmp/ccZLdZ1g.o: In function `boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char const* const*)':
test.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcEC2EiPKPKc[_ZN5boost15program_options25basic_command_line_parserIcEC5EiPKPKc]+0x97): undefined reference to `boost::program_options::detail::cmdline::cmdline(std::__debug::vector<std::string, std::allocator<std::string> > const&)'
collect2: error: ld returned 1 exit status

据我所知,链接器无法找到函数 boost::program_options::detail::cmdline::cmdline(std::__debug::vector<std::string, std::allocator<std::string> > const&) ,因为它的参数被调试 vector 代替了正常的 std::vector .但是为什么会这样呢?有没有人知道解决方法,使 Boost Program Options 与 GLIBCXX_DEBUG 一起工作?

我使用以下系统:

  • Debian Wheezy
  • g++ (Debian 4.7.2-5) 4.7.2
  • libboost-all-dev 1.49.0.1,通过 aptitude 安装

感谢您的帮助

最佳答案

这里的错误信息很清楚,链接器找不到符号

boost::program_options::detail::cmdline::cmdline(std::__debug::vector<std::string, std::allocator<std::string> > const&)

请注意额外的 __debug 命名空间,这意味着您正在使用 _GLIBCXX_DEBUG 进行构建。这不会起作用,因为您的包维护者没有使用此定义构建 boost 库,因此会出现链接器错误。你有几个选择

  • 从任何包含程序选项 header 的翻译单元中删除 _GLIBCXX_DEBUG。这可能需要进行一些重构,具体取决于您在启用迭代器调试的情况下尝试解决的问题。
  • 使用 -D_GLIBCCX_DEBUG 构建 boost 库。这也可能不是微不足道的,尽管 boost 构建系统相当简单。

关于c++ - boost 程序选项不适用于 GLIBCXX_DEBUG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19729036/

相关文章:

c++ - 在公共(public)层次结构中的类之间共享析构函数

c++ - 赋值运算符重载c++的返回值

c++ Boost if .extension() == ""这意味着这个文件是一个文件夹?

c++ - 在 Eclipse 中向 'link' 命令添加引号

c++ - extern "C"在 C 中是否有任何影响?

C++ - 如何键入别名、typedef 或包装 boost::variant?

c++ - 串行 channel 上的 boost::asio::async_write 问题

c++ - 体系结构 x86_64 的 undefined symbol ,链接器命令失败

gcc - 为什么链接库的顺序有时会导致 GCC 出错?

通过模板的 C++ 类说明符alignas 选项