2013-01-16 25 views
6

Ho il seguente programma di giocattolo che dà gli errori con il CCG MacPorts su OSX 10,6boost :: program_options dà errore malloc

#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; 
} 

ho spinta versione 1.52 installato con MacPorts. Compilo il programma come

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

Si compila bene:

$ ./a.out 
Program continues 

Ma non può stampare il messaggio di aiuto:

$ ./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 

Ho sentito che roba come questo può accadere se il le librerie sono compilate con una versione diversa di gcc rispetto a quella usata per costruire il programma. Come posso verificare questo? Ho

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

Aggiornamento: questo sembra funzionare su una macchina Linux con e Boost anziani.

Update 2: l'uscita di gdb segue

(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) 

Update 3: Il programma funziona bene con il gcc42 Xcode, il problema si verifica solo con il gcc MacPorts.

+3

Questo codice mi sembra corretto (rispetto al mio codice sorgente che utilizza program_options). Potresti eseguirlo in gdb (compilare con -ggdb3 -O0 ed eseguire 'gdb --args ./a.out --help' e digitare' run' e 'bt')? –

+0

@ RafałRawicki, hai appena aggiunto le informazioni gdb dopo aver compilato le tue bandiere – highBandWidth

risposta

1

Il motivo più probabile per il tuo errore è che vi è una mancata corrispondenza tra le interfacce presentate nei file di intestazione program_options e l'implementazione come prelevata nella libreria compilata. Questo potrebbe essere dovuto al fatto che stai accidentalmente raccogliendo una libreria compilata da una versione diversa di boost o forse perché hai compilato la libreria con una versione diversa del compilatore rispetto a quella che stai utilizzando per compilare il tuo programma di test.

+0

C'è un modo per verificare ad esempio quale versione della libreria compilata è o quale compilatore è stato utilizzato per generare la libreria? – highBandWidth

+0

Su Linux è possibile utilizzare objdump -x per scoprire molte di queste informazioni (nome SO, versioni di glibc e cxxabi). Non so su OS X però –