macos静态链接libstdc ++和g ++ 4.7.2

时间:2013-07-30 13:29:12

标签: macos static compilation g++ libstdc++

我一直在看这个问题好几个星期,现在没有快乐,所以是时候要求堆栈溢出的智慧......

由于各种原因,我需要将libstdc ++链接到我的可执行文件中,因此它没有额外的依赖项。使用g ++的-static-libstdc ++和-static-libgcc标志我能够实现这一点,但是,没有例外被捕获。

我制作了以下测试代码以进一步调查问题。当我在32位模式下编译而不是64位时,代码似乎有效。我不明白为什么异常没有被捕获而且相当令人沮丧。

设置

  • Macos 10.7 64 bit
  • 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。

1 个答案:

答案 0 :(得分:0)