簡體   English   中英

是否可以在Mac OSX 10.6中靜態鏈接libstdc ++?

[英]Is it possible to link libstdc++ statically in Mac OSX 10.6?

我試圖在其他Mac OSX機器上運行我的C ++程序,這些機器可能有較舊的libstdc ++副本,但擁有所有其他工具。 我試圖遵循這個方法 ,也在這個SO問題中提到過,即使它討論了linux設置。 我有小程序try.cpp:

#include <iostream>

int main() {
        int a = 10;
        std::cout << a << '\n';
        return 1;
}

顯然,如果我只是編譯它,我得到

$ /usr/bin/g++ try.cpp 
$ otool -L a.out 
a.out:
 /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

我理解對libSystem.B.dylib的依賴,我們可以把它放在一邊。 為了試圖擺脫libstdc ++,我試試這個:

$ /usr/bin/g++ try.cpp /usr/lib/libstdc++-static.a 
$ otool -L a.out 
a.out:
 /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

所以,我試試

$ ln /usr/lib/libstdc++-static.a .
$ /usr/bin/g++ try.cpp -L.
$ otool -L a.out 
a.out:
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

要么,

$ /usr/bin/g++ try.cpp -L. -lstdc++-static
$ otool -L a.out 
a.out:
 /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

最后,這有效:

$ /usr/bin/gcc try.cpp -L. -lstdc++-static
$ otool -L a.out 
a.out:
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

這好嗎? (使用gcc鏈接C ++程序和libstdc ++)。 我聽說g ++實際上是一個使用gcc和libstdc ++來編譯C ++程序的腳本。 如果是這種情況,我們正確使用它應該沒問題。

但是,我實際上使用的是macport編譯器和一個更復雜的程序,gcc生成一些警告,而它符合C ++。 有效的東西:

ld: warning: std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::~basic_stringbuf() has different visibility (hidden) in /opt/local/lib/gcc44/libstdc++.a(sstream-inst.o) and (default) in /var/folders/2u/2uLPtE+3HMi-BQIEfFVbSE+++TU/-Tmp-//ccoE2rqh.o

這表明我們不應該使用gcc進行c ++編譯。 總而言之,問題是:

  • 如何靜態鏈接libstdc ++
  • 如果g ++沒有這樣做,可以使用gcc並手動提供libstdc ++嗎? 然后為什么能見度警告?
  • 如果由於編譯庫中的可見性問題,這兩種方法都不起作用,為什么不使用libstdc ++ 文件(sstream.h,list.h,vector.c)等,只是將它們包含在編譯中。 即使這會使編譯變慢,但它對某些應用程序可能很有用。 它甚至可能導致更好的優化!

聽起來你只想要定位早期的Mac OS X版本,這可以在沒有靜態鏈接libstdc++情況下完成。 我認為Xcode附帶的GCC默認是針對主機環境的。 但是,它可以處理一個名為-mmacosx-version-min的特殊標志來更改目標環境。 如果您為此提供目標OS X版本號,則它將自動創建與該版本的Mac OS X兼容的二進制文件。

#include <iostream>

int main(void)
{
    std::cout << "Hello world!" << std::endl;
    return 0;
}

編譯如下:

g++ -mmacosx-version-min=10.4 test.cpp

我編譯了這個程序兩次,一次使用旗幟,一次沒有,然后我將兩個二進制文件復制到運行10.4的Mac上。 標志執行編譯那個正確執行,但是沒有標志編譯的那個表示“可執行文件中的CPU類型不好”(盡管事實上它是在運行更高版本的OS X的相同機器上編譯的)。

如果你已經指定10.4作為最低目標(我不確定C ++標題,但Cocoa,Foundation,AppKit等框架標題),一些標題有宏保護,阻止你使用10.5或10.6中引入的函數/類絕對做到)。

據我所知,這是一個延伸,但我在這里看到的回答很少!

GCC是一個編譯器驅動程序,也將驅動鏈接器。 g ++對我的理解更多的只是一個編譯器。 因此,要使G ++正確構建,我相信您需要構建目標文件並手動鏈接它們。 在我的頭腦中,我不能說如何做到這一點,因為我此刻IDE腦部受損。

至於您所看到的錯誤可能是由於鏈接的文件錯誤。我現在在iPhone上,所以我不打算刪除您打印的錯誤消息。 我不是所有MacPorts的粉絲,所以不要驚訝於那個裝置搞砸了。 首先,請確保您使用MacPorts編譯器的MacPorts庫。

最后,我毫不懷疑你可以做你想做的事。 但是,您需要開始閱讀Make文件以及GCC工具集的更多文檔。 專注於構建文件並將其鏈接到程序中。 您可能希望找到一個小型的開源程序,可以在Mac上很好地構建並查看Make文件。

當然,找到一個好的基於C ++的項目來學習並不容易。 然而,我會建議安裝LLVM和CLang,特別是考慮到新的轉速假設是C ++就緒。 顯然,一組不同的工具,但CLang可能會解決您的問題或至少為您提供更好的調試信息。 也許有人可以使用一個帶有簡單干凈的make文件的開源C ++項目。 我最近看到的最近的是一個名為HeeksCAD的項目。

最后,當構建任何不平凡的東西時,你最終需要的不僅僅是GCC。 現在很多都是用IDE來處理的,但是我不確定XCode是否可以正確配置來做你想做的事情。

暫無
暫無

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

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