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.
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')? –
@ RafałRawicki, właśnie dodałem informację gdb po kompilacji z twoimi flagami – highBandWidth