0

我已经关注这个问题好几个星期了,没有任何喜悦,所以是时候询问堆栈溢出的智慧了......

由于各种原因,我需要将 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。

4

1 回答 1

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

于 2013-09-20T15:36:13.540 回答