我一直在寻找这个问题的几个星期,现在没有快乐所以它的时候问堆栈溢出的智慧......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的。