58

OS Xの静的ライブラリにリンクしようとしています-static。gccコマンドでフラグを使用しましたが、次のエラーメッセージが表示されます。

ld_classic:次のファイルが見つかりません:-lcrt0.o
collect2:ldが1つの終了ステータスを返しました

マニュアルページを調べたところ、次のようになっています。

このオプションは、すべてのライブラリ(libgcc.aを含む)も-staticでコンパイルされていない限り、MacOSXでは機能しません。libSystem.dylibの静的バージョンもcrt0.oも提供されていないため、このオプションはほとんどの人にとって役に立ちません。

この静的ライブラリにリンクする別の方法はありますか?

4

5 に答える 5

54

アーカイブ ライブラリ (静的ライブラリと呼ばれることもあります) にリンクするには、それをリンク行に追加するだけです。

gcc main.o ... -lfoo ...

リンカは libfoo.dylib を検索し、次に libfoo.a を検索します。必要なのはこれだけです。

ライブラリの両方のバージョンがあり、動的バージョンよりもアーカイブ バージョンにリンクしたい場合は、リンク行にアーカイブへのフル パスを指定するだけです。

gcc main.o ... /path/to/libfoo.a ...
于 2009-05-10T21:54:10.717 に答える
19

残念ながら、サポートされていません。手動でcrt0をコンパイルすることは可能であると報告した人もいますが、誰もそれを確認していません。

于 2009-12-04T16:33:11.900 に答える
18

一般的なケースは、システム フレームワークおよびライブラリに対して動的にリンクしながら、サード パーティのライブラリに対して静的にリンクすることです。これにより、ユーザーはプログラムを使用する前にサード パーティのライブラリをインストールする必要がなくなります。ライブラリがフレームワークに対して動的にリンクされている場合 (よくあることですが)、静的な .a が同梱されている場合もありますが、.a には依存関係がないため、単に置き換えるだけ-l<libname>では不十分です。/path/to/libname.aまた、ライブラリが使用していたフレームワークに対して動的にリンクする必要があります。

たとえば、ユーザーが libusb をダウンロードしてインストールする必要なく、オープン ソースの libusb を使用するプログラムを作成したいとします。これで構築した動的にリンクされたバイナリがあるとします:

clang -lusb-1.0 main.c -o myprogram

-frameworkOS X で静的にリンクするには、コマンドは次のようになります (引数に注意してください)。

clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram

追加する必要があるシステム フレームワークとライブラリを見つけるには、otool を使用してサード パーティの dylib を調べます。

otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib

これは以下を示します:

/usr/local/opt/libusb/lib/libusb-1.0.0.dylib:
    /usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)  

フレームワークを追加することから始めて、ライブラリを 1 つずつ追加すると、未定義の参照エラーのリストが縮小されます。一部のライブラリは、明示的に追加したライブラリの依存関係として読み込まれる可能性があるため、すべてのライブラリを追加する必要はないことに注意してください。

dylib がどこにあるかわからない場合は、元の動的な方法 (-lusb-1.0 を使用) でプログラムをビルドし、otool を実行します。

clang -lusb-1.0 main.c -o myprogram
otool -L myprogram

与える:

myprogram:
    /usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

また、リンク先のライブラリのライセンスもお読みください。

于 2017-01-06T21:39:44.043 に答える
9

-BstaticOS-X Lionではノーオペレーションのようです-gcc -vこれを確認するために使用されます。

于 2012-08-07T19:39:30.623 に答える