【问题标题】:macos statically linking libstdc++ with g++ 4.7.2macos 静态链接 libstdc++ 和 g++ 4.7.2
【发布时间】:2013-07-30 13:29:11
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      相关资源
      最近更新 更多