我一直在看这个问题好几个星期,现在没有快乐,所以是时候要求堆栈溢出的智慧......
由于各种原因,我需要将libstdc ++链接到我的可执行文件中,因此它没有额外的依赖项。使用g ++的-static-libstdc ++和-static-libgcc标志我能够实现这一点,但是,没有例外被捕获。
我制作了以下测试代码以进一步调查问题。当我在32位模式下编译而不是64位时,代码似乎有效。我不明白为什么异常没有被捕获而且相当令人沮丧。
设置
该项目
#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
我尝试了许多不同的方法来尝试解决这个问题,包括:
但无济于事。
我需要检查编译器配置的某些部分吗? 我错过了一面旗帜?
我知道mac在版本4.2.1上停止支持g ++所以最好转到使用clang并希望二进制文件仍适用于不同版本的OSX。
答案 0 :(得分: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