Опции программы Boost не будут работать с GLIBCXX_DEBUG

У меня есть следующий пример кода:

#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&)потому что его аргумент заменен вектором отладки вместо нормального std::vector, Но почему это происходит? И кто-нибудь знает обходной путь, чтобы заставить параметры программы Boost работать с GLIBCXX_DEBUG?

Я использую следующую систему:

  • Debian Wheezy
  • g ++ (Debian 4.7.2-5) 4.7.2
  • libboost-all-dev 1.49.0.1, устанавливается через aptitude

Спасибо за любую помощь

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, Это также может быть не тривиальным, хотя система форсированной сборки довольно проста.
Другие вопросы по тегам