boost::program_options выдает ошибку malloc

У меня есть следующая игрушечная программа, которая выдает ошибки с gcc MacPorts на OSX 10.6

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

#include <iostream>
using namespace std;

int main(int ac, char* av[])
{
        po::options_description desc("Allowed options");
        desc.add_options()  ("help", "produce help message")  ;

        po::variables_map vm;        
        po::store(po::parse_command_line(ac, av, desc), vm);
        po::notify(vm);    

        if (vm.count("help")) {
            cout << desc << "\n";
            return 0;
        }
        cout << "Program continues\n";
        return 0;
}

У меня установлена ​​версия Boost 1.52 с MacPorts. Я компилирую программу как

g++ a.cpp -lboost_program_options-mt -L/opt/local/lib -g -O0

Он отлично компилируется:

$ ./a.out
Program continues

Но он не может напечатать справочное сообщение:

$ ./a.out --help
Allowed options:
a.out(40110) malloc: *** error for object 0x7fff70ca3500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap

Я слышал, что подобные вещи могут произойти, если библиотеки скомпилированы с другой версией gcc, чем та, которая использовалась для сборки программы. Как мне это проверить? У меня есть

$ g++ --version
g++ (MacPorts gcc47 4.7.2_2) 4.7.2

Обновление: похоже, это работает на компьютере с Linux с Boost и старше.

Обновление 2: вывод gdb следующий

(gdb) run 
Starting program: /Users/yasir/Downloads/mask.util/a.out --help
Reading symbols for shared libraries ++++.. done
Allowed options:
a.out(42256) malloc: *** error for object 0x7fff70ca3500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Program received signal SIGABRT, Aborted.
0x00007fff821030b6 in __kill ()
(gdb) bt
#0  0x00007fff821030b6 in __kill ()
#1  0x00007fff821a39f6 in abort ()
#2  0x00007fff820bb195 in free ()
#3  0x00000001001188b4 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow ()
(gdb) 

Обновление 3: программа отлично работает с Xcode gcc42, проблема возникает только с MacPorts gcc.


person highBandWidth    schedule 16.01.2013    source источник
comment
Этот код кажется мне правильным (по сравнению с моим исходным кодом, использующим program_options). Не могли бы вы запустить это в gdb (скомпилировать с -ggdb3 -O0 и запустить gdb --args ./a.out --help и ввести run и bt)?   -  person Rafał Rawicki    schedule 17.01.2013
comment
@RafałRawicki, только что добавил информацию gdb после компиляции с вашими флагами   -  person highBandWidth    schedule 17.01.2013


Ответы (1)


Наиболее вероятной причиной вашей ошибки является несоответствие между интерфейсами, представленными в заголовочных файлах program_options, и реализацией, полученной в вашей скомпилированной библиотеке. Это может быть либо из-за того, что вы случайно выбрали скомпилированную библиотеку из другой версии boost, либо из-за того, что вы скомпилировали библиотеку с другой версией компилятора, чем та, которую вы используете для компиляции своей тестовой программы.

person Bojan Nikolic    schedule 14.02.2013
comment
Есть ли способ проверить, например, какая версия скомпилированной библиотеки или какой компилятор использовался для создания библиотеки? - person highBandWidth; 14.02.2013
comment
В Linux вы можете использовать objdump -x, чтобы узнать большую часть этой информации (имя SO, версии glibc и cxxabi). Не знаю об OS X, хотя - person Bojan Nikolic; 14.02.2013