我一直在尋找這個問題的幾個星期,現在沒有快樂所以它的時候問堆棧溢出的智慧......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的。