私はこの問題を何週間も楽しみながら見てきたので、スタックオーバーフローの知恵を求める時が来ました...
さまざまな理由から、余分な依存関係がないように、libstdc++ を実行可能ファイルにリンクする必要があります。g++ の -static-libstdc++ フラグと -static-libgcc フラグを使用してこれを達成できましたが、例外はキャッチされませんでした。
問題をさらに調査するために、次のテスト コードを作成しました。32 モードでコンパイルするとコードが機能するようですが、64 ビットでは機能しません。例外がキャッチされず、かなりイライラする理由がわかりません。
設定
- Macos 10.7 64 ビット
- G++ 4.7.2
プログラム
#include <cstdio>
#include <stdexcept>
void myMethod() {
throw std::invalid_argument("foo");
}
int main () {
try {
myMethod();
} catch (const std::invalid_argument& ex) {
printf("caught: %s\n", ex.what());
} catch (...) {
printf("caught it\n");
}
return 0;
}
32ビットモード
$ g++ -m32 -o main Main.cpp -static-libgcc -static-libstdc++ && otool -L ./main && ./main
./main:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
caught: foo
64ビットモード
$ g++ -o main Main.cpp -static-libgcc -static-libstdc++ && otool -L ./main && ./main
./main:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
Abort trap: 6
この問題を解決するために、次のようなさまざまな方法を試しました。
- 静的ライブラリ (/usr/local/lib/libstdc++.a) との直接リンク
- -Wl,-bstatic -lstdc++ -lgcc_eh -bdynamic の使用
しかし、役に立たない。
確認する必要があるコンパイラ構成の一部はありますか? 私が行方不明の旗?
Mac がバージョン 4.2.1 で g++ のサポートを停止したことは知っているので、clang の使用に移行し、バイナリが異なるバージョンの OSX でも動作することを期待することをお勧めします。