2011-11-16 22 views
6

私のC++コンパイラは、ダイナミックライブラリを含む "dylib"ファイルを作成します。 .dylibと.soファイルの違いは何ですか?dylibファイルの意味は何ですか?

Mach-O形式のファイルとELF形式のファイルの違いは何ですか?私は、iOS(静的ライブラリのみ/ Mach-O)とAndroid(ELF)で後で使用するためにファイルを構築する必要があります。

Thanx!

答えて

4

私がことがわかった:多くの人を驚かせる当たる

つのMach-O機能は、共有ライブラリ、動的にロード可能なモジュール間の厳密な区別 です。 ELFシステムでは、どちらも同じです。共有コードの任意の部分をライブラリとして、動的ロード用に として使用できます。 some_fileのファイルタイプ を表示するには、otool -hv some_fileを使用します。

Mach-O共有ライブラリは、ファイルタイプMH_DYLIBを持ち、 拡張子.dylibを持ちます。これらは、通常の固定の リンカフラグでリンクすることができます。 libfoo.dylibの場合は-lfoo。しかし、彼らは をモジュールとしてロードできません。 (サイドノート:共有ライブラリはAPIを使用して動的に をロードできますが、そのAPIはバンドルの APIと異なり、dlopen() エミュレーションでは役に立たなくなります。特に共有ライブラリはアンロードできません)[ はもはや真ではありません。dylibとバンドルの両方でdlopen()を使用できます。 しかし、dylibはまだアンロードできません。]

ロード可能なモジュールは、Mach-Oで「バンドル」と呼ばれます。彼らは ファイルタイプMH_BUNDLEを持っています。関係するコンポーネントは何も気にしないので、 は任意の拡張子を持つことができます。拡張子.bundleは Appleによって推奨されていますが、ほとんどの移植されたソフトウェアは 互換性のために.soを使用しています。バンドルは、dyld APIを使用して動的にロードおよびアンロードできます。さらに、 APIの上にdlopen()をエミュレートするラッパーがあります。 [dlopenは現在、優先APIになっています。] を共有ライブラリのようにバンドルにリンクすることはできません。ただし、バンドルが実際の共有ライブラリとリンクされている可能性があります。 です。バンドルがロードされると、それらのファイルは自動的にロードされます。

OS Xで通常の共有ライブラリをコンパイルするには、-dynamiclib と拡張子.dylibを使用する必要があります。 -fPICがデフォルトです。