2013-07-30 34 views
0

我一直在尋找這個問題的幾個星期,現在沒有快樂所以它的時候問堆棧溢出的智慧......MacOS的靜態鏈接的libstdC++與G ++ 4.7.2

由於各種原因我需要將libstdC++鏈接到我的可執行文件,以便它沒有額外的依賴關係。使用g ++的-static-libstdC++和-static-libgcc標誌我能夠實現這一點,但是,沒有任何異常被捕獲。

我產生了以下的測試代碼,以進一步調查此問題。當我以32位模式編譯但不是64位編譯時,它似乎起作用。我不明白爲什麼這個例外沒有被捕獲,而且相當令人沮喪。

設置

  • MACOS 10.7 64位
  • G ++ 4.7.2

的proram

#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 /鏈接本地/ LIB /的libstdC++。一個
  • 使用-Wl,-Bstatic -lstdC++ -lgcc_eh -Bdynamic

但無濟於事。

有編譯器的配置,我需要檢查的某些部分? 我錯過了一面旗幟?

我知道MAC停在4.2.1版本,支持G ++所以它可能是更好的移動到使用鐺,希望二進制仍然工作在不同版本的OSX的。

回答