2013-01-16 16 views
6

mam następujący program zabawki, które daje błędy z GCC DarwinPorts na OSX 10.6boost :: program_options daje Malloc error

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

mam doładowania wersji 1.52 zainstalowany z DarwinPorts. I skompilować program jako

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

To kompiluje grzywny:

$ ./a.out 
Program continues 

Ale to nie może wydrukować komunikat pomocy:

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

Słyszałem, że coś takiego może się zdarzyć, jeśli biblioteki są kompilowane przy użyciu innej wersji gcc niż ta, która została użyta do zbudowania programu. Jak mogę to sprawdzić? Mam

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

Aktualizacja: to wydaje się działać na komputerze z systemem Linux i starszych z doładowania.

Aktualizacja 2: wyjście z gdb następująco

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

aktualizacji 3: Program współpracuje z gcc42 Xcode, problem występuje tylko z GCC DarwinPorts.

+3

Ten kod wygląda mi na prawidłowy (w porównaniu z moim kodem źródłowym przy użyciu opcji program_opcje). Czy możesz uruchomić to w gdb (skompilować z -ggdb3-O0 i uruchomić 'gdb --args ./a.out --help' i wpisać' run' i 'bt')? –

+0

@ RafałRawicki, właśnie dodałem informację gdb po kompilacji z twoimi flagami – highBandWidth

Odpowiedz

1

Najbardziej prawdopodobną przyczyną błędu jest niezgodność między interfejsami prezentowanymi w plikach nagłówkowych programu narzędziowego a implementacją podjętą w skompilowanej bibliotece. Może to być spowodowane przypadkowym pobraniem skompilowanej biblioteki z innej wersji boostu, lub może dlatego, że skompilowałeś bibliotekę z inną wersją kompilatora do tej, której używasz do kompilacji programu testowego.

+0

Czy istnieje sposób sprawdzenia na przykład, która wersja skompilowanej biblioteki jest, lub który kompilator został użyty do wygenerowania biblioteki? – highBandWidth

+0

W systemie Linux można użyć objdump -x, aby dowiedzieć się wiele z tych informacji (nazwa SO, wersje glibc i cxxabi). Nie wiem jednak o OS X –

Powiązane problemy