Boost程序选项不适用于GLIBCXX_DEBUG

Haa*_*hii 10 c++ linker boost 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;
}
Run Code Online (Sandbox Code Playgroud)

它使用例如编译好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
Run Code Online (Sandbox Code Playgroud)

据我所知,链接器找不到该函数boost::program_options::detail::cmdline::cmdline(std::__debug::vector<std::string, std::allocator<std::string> > const&),因为它的参数被调试向量代替而不是正常std::vector.但为什么会这样呢?有没有人知道一个解决方法,使Boost程序选项适用GLIBCXX_DEBUG

我使用以下系统:

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

谢谢你的帮助

Sam*_*ler 6

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

boost::program_options::detail::cmdline::cmdline(std::__debug::vector<std::string, std::allocator<std::string> > const&)
Run Code Online (Sandbox Code Playgroud)

请注意附加__debug名称空间,这意味着您正在构建_GLIBCXX_DEBUG.这不起作用,因为您的软件包维护者没有使用此定义构建boost库,因此链接器错误.你有几个选择

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