6

OSX10.6のMacPortsgccでエラーが発生する次のおもちゃのプログラムがあります

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

MacPortsにBoostバージョン1.52をインストールしています。私はプログラムを次のようにコンパイルします

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

更新:これは、以前のBoostを搭載したLinuxマシンで機能するようです。

アップデート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で正常に動作し、問題はMacPortsgccでのみ発生します。

4

1 に答える 1

1

エラーの原因として最も可能性が高いのは、program_options ヘッダー ファイルに示されているインターフェイスと、コンパイルされたライブラリで取得された実装との間に不一致があることです。これは、コンパイル済みライブラリを別のバージョンの boost から誤って選択したか、テスト プログラムのコンパイルに使用しているコンパイラとは異なるバージョンのコンパイラでライブラリをコンパイルしたことが原因である可能性があります。

于 2013-02-14T13:27:10.970 に答える