そこで私は最近、llvm-gccコンパイラを使用して、OSX上のいくつかの静的ライブラリと動的ライブラリにリンクする大規模なソフトウェアプロジェクトに取り組み始めました。
stlに深刻な問題があります。具体的には、非常に単純なコードがクラッシュします。たとえば、私のメインプロジェクトでは、次のコードがクラッシュします。
{
std::vector< unsigned int > testvec;
testvec.resize( 1 );
testvec[0] = 0;
}
std :: vector <unsigned int>デストラクタ内でスコープを終了し、SIGABRTをスローし、割り当て解除されたメモリが割り当てられていないと言ったときにクラッシュします。具体的には:
malloc: *** error for object 0x135e8fc30: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
これはリリースビルドでのみ発生します-デバッグビルドは問題なく機能します。
私の推測では、外部ライブラリの1つが、異なる内部メモリレイアウトを使用する別のバージョンのSTLに対してリンクされているため、サイズなどの割り当てを解除しようとしています。
リンクしているすべてのライブラリでnmを実行しましたが、そのうちのいくつかには外部stlシンボルがあります(具体的には、std :: vector <unsigned int>デストラクタはnm出力でSでマークされています)。しかし、どちらが原因かわかりません。
.aまたはdylibファイルを検査して、異なるバージョンのSTLに対してリンクしているファイルを追跡する方法はありますか?
[編集]
これは、2つの静的ライブラリ、2つの異なるベクトル実装で説明されている状況の実際の例のように見えますが、リンカーは何をしますか? リンカーが恐ろしい、恐ろしいことをしていることがわかりました.. :)