【问题标题】:Boost Program Options won't work with GLIBCXX_DEBUGBoost Program Options 不适用于 GLIBCXX_DEBUG
【发布时间】:2013-11-12 18:54:51
【问题描述】:

我有以下示例代码:

#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。 但是,如果我尝试使用调用 g++ test.cpp -lboost_program_options -D_GLIBCXX_DEBUG 激活 GCC 边界检查,则会引发以下链接器错误:

/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&lt;std::string, std::allocator&lt;std::string&gt; &gt; const&amp;),因为它的参数被一个调试向量代替,而不是普通的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的调试库
  • @P0W,我假设这些是用GLIBCXX_DEBUG 编译的boost 库,对吧?那么有没有一种方便的方法来获取它们并在两者之间切换?
  • 不,-dev 后缀通常意味着包包含开发者头文件和链接库。这并不意味着启用了 libstdc++ 迭代器调试。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,谢谢。我成功地使用-D_GLIBCCX_DEBUG 从源代码构建了所需的 boost 库,并且它可以工作。但是,我发现默认的 boost 安装在启用边界检查的情况下不起作用,这有点令人失望。相应的调试符号可以直接包含在库中,不是吗?
  • @Haatschii 没有默认的 boost 安装,您的包维护者可能会提供多种选择。虽然我怀疑任何人都会启用迭代器调试。它不仅仅是调试符号,还必须使用定义的 _GLIBCXX_DEBUG 标志重新编译库。
  • @Haatschii 你是如何用 -D_GLIBCXX_DEBUG 编译 boost 的?
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2011-11-02
  • 1970-01-01
相关资源
最近更新 更多