我已经关注这个问题好几个星期了,没有任何喜悦,所以是时候询问堆栈溢出的智慧了......
由于各种原因,我需要将 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。