2013-07-30 37 views
0

我一直在寻找这个问题的几个星期,现在没有快乐所以它的时候问堆栈溢出的智慧......MacOS的静态链接的libstdC++与G ++ 4.7.2

由于各种原因我需要将libstdC++链接到我的可执行文件,以便它没有额外的依赖关系。使用g ++的-static-libstdC++和-static-libgcc标志我能够实现这一点,但是,没有任何异常被捕获。

我产生了以下的测试代码,以进一步调查此问题。当我以32位模式编译但不是64位编译时,它似乎起作用。我不明白为什么这个例外没有被捕获,而且相当令人沮丧。

设置

  • MACOS 10.7 64位
  • G ++ 4.7.2

的proram

#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 /链接本地/ LIB /的libstdC++。一个
  • 使用-Wl,-Bstatic -lstdC++ -lgcc_eh -Bdynamic

但无济于事。

有编译器的配置,我需要检查的某些部分? 我错过了一面旗帜?

我知道MAC停在4.2.1版本,支持G ++所以它可能是更好的移动到使用铛,希望二进制仍然工作在不同版本的OSX的。

回答