簡體   English   中英

macOS將libstdc ++與g ++ 4.7.2靜態鏈接

[英]macos statically linking libstdc++ with g++ 4.7.2

我一直在這個問題上待了好幾個星期,沒有任何喜悅,所以是時候問一下堆棧溢出的智慧了...

由於各種原因,我需要將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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM