0

私はこの問題を何週間も楽しみながら見てきたので、スタックオーバーフローの知恵を求める時が来ました...

さまざまな理由から、余分な依存関係がないように、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 でも動作することを期待することをお勧めします。

4

1 に答える 1

0

Mac OS X の GCC では、例外が少し壊れていると思います。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45486
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42159

于 2013-09-20T15:36:13.540 に答える