回答:
Mac OS Xで実行可能ファイルとライブラリに使用されるMach-Oオブジェクトファイル形式は、共有ライブラリと動的に読み込まれるモジュールを区別します。otool -hv some_file
のファイルタイプを確認するために使用しますsome_file
。
Mach-O共有ライブラリにはファイルタイプがMH_DYLIB
あり、拡張子.dylib が付いています。それらは、たとえば-lfoo
libfoo.dylibの場合など、通常の静的リンカーフラグとリンクできます。-dynamiclib
フラグをコンパイラーに渡すことで作成できます。(-fPIC
デフォルトであり、指定する必要はありません。)
ロード可能なモジュールは、Mach-Oスピーチでは「バンドル」と呼ばれます。ファイルの種類がありますMH_BUNDLE
。彼らはどんな拡張子も運ぶことができます。拡張機能.bundle
はAppleによって推奨されていますが.so
、互換性のためにほとんどの移植ソフトウェアが使用しています。通常、アプリケーションを拡張するプラグインにはバンドルを使用します。このような状況では、バンドルはアプリケーションバイナリにリンクして、アプリケーションのエクスポートされたAPIにアクセスします。-bundle
フラグをコンパイラーに渡すことで作成できます。
dylibとバンドルの両方は、dl
API(dlopen
などdlclose
)を使用して動的にロードできます。バンドルを共有ライブラリのようにリンクすることはできません。ただし、バンドルが実際の共有ライブラリに対してリンクされている可能性があります。これらは、バンドルがロードされるときに自動的にロードされます。
歴史的に、違いはより重要でした。Mac OS X 10.0では、ライブラリを動的にロードする方法がありませんでした。バンドルをロードおよびアンロードするためにNSCreateObjectFileImageFromFile
、dyld APIのセット(などNSLinkModule
)が10.1で導入されましたが、dylibでは機能しませんでした。dlopen
バンドルで動作する互換性ライブラリは10.3で追加されました。10.4では、dlopen
dyldのネイティブ部分に書き直され、dylibのロード(アンロードではない)のサポートが追加されました。最後に、10.5 dlclose
はdylibs での使用のサポートを追加し、dyld APIを非推奨にしました。
LinuxなどのELFシステムでは、どちらも同じファイル形式を使用します。共有コードの任意の部分をライブラリとして使用したり、動的ロードに使用したりできます。
最後に、Mac OS Xでは、「バンドル」は、実行可能コードとそのコードで使用されるリソースを保持する標準化された構造のディレクトリを指すこともあります。いくつかの概念的なオーバーラップがあります(特に、プラグインのような「ロード可能なバンドル」とは通常、Mach-Oバンドルの形式で実行可能コードが含まれています)が、上記のMach-Oバンドルと混同しないでください。
追加の参照:
-dynamiclib
GCCフラグです。コンパイラー-dylib
をldに渡します。
ファイル.soは、共有ライブラリのUNIXファイル拡張子ではありません。
それはたまたま一般的なものです。
ArnaudRecipes sharedlibページの 3b行目を確認してください
基本的に.dylibは、共有libを示すために使用されるmacファイル拡張子です。
Mac OS Xでの.dylibと.soの違いは、それらがどのようにコンパイルされるかです。.soファイルには-sharedを使用し、.dylibには-dynamiclibを使用します。.soと.dylibはどちらも動的ライブラリファイルとして交換可能で、タイプはDYLIBまたはBUNDLEのいずれかです。これを示すさまざまなファイルの読み取り値を示します。
libtriangle.dylib:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 17 1368 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS
libtriangle.so:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 17 1256 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS
triangle.so:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 BUNDLE 16 1696 NOUNDEFS DYLDLINK TWOLEVEL
Mac OS Xで2つが同等である理由は、.soファイルタイプにコンパイルされる他のUNIX OSプログラムとの下位互換性のためです。
コンパイルに関する注意事項:.soファイルまたは.dylibファイルのどちらをコンパイルする場合でも、リンク手順中に動的ライブラリに正しいパスを挿入する必要があります。これを行うには、-install_nameとファイルパスをリンクコマンドに追加します。これを行わないと、この投稿に見られる問題に遭遇します:Mac Dynamic Library Craziness(May be Fortran Only)。
./configure
を生成する方法を教えてください。 このタスクは行いません。.dylib
.so
./configure --enable-shared
cmakeを使用してOSXで単純なコードをビルドしているときにちょうど観察したこと:
cmake ... -DBUILD_SHARED_LIBS=OFF ...
.soファイルを作成します
ながら
cmake ... -DBUILD_SHARED_LIBS=ON ...
.dynlibファイルを作成します。
たぶん、これは誰にとっても役立ちます。