一般的なケースは、システム フレームワークおよびライブラリに対して動的にリンクしながら、サード パーティのライブラリに対して静的にリンクすることです。これにより、ユーザーはプログラムを使用する前にサード パーティのライブラリをインストールする必要がなくなります。ライブラリがフレームワークに対して動的にリンクされている場合 (よくあることですが)、静的な .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)
また、リンク先のライブラリのライセンスもお読みください。