私の C++ コンパイラは、動的ライブラリを含む「dylib」ファイルを作成します。.dylib と .so ファイルの違いは何ですか?
また、Mach-O 形式のファイルと ELF 形式のファイルの違いは何ですか? iOS (静的ライブラリのみ/Mach-O) および Android (ELF) で後で使用するためにファイルをビルドする必要があります。
ありがとう!
私の C++ コンパイラは、動的ライブラリを含む「dylib」ファイルを作成します。.dylib と .so ファイルの違いは何ですか?
また、Mach-O 形式のファイルと ELF 形式のファイルの違いは何ですか? iOS (静的ライブラリのみ/Mach-O) および Android (ELF) で後で使用するためにファイルをビルドする必要があります。
ありがとう!
見つけた:
多くの人を驚かせるMach-Oの機能の1つは、共有ライブラリと動的にロード可能なモジュールの厳密な違いです。ELFシステムでは、どちらも同じです。共有コードの任意の部分をライブラリとして、および動的ロードに使用できます。otool -hv some_fileを使用して、some_fileのファイルタイプを確認します。
Mach-O共有ライブラリのファイルタイプはMH_DYLIBで、拡張子は.dylibです。これらは、通常の静的リンカーフラグ(libfoo.dylibの場合は-lfooなど)とリンクできます。ただし、モジュールとしてロードすることはできません。(補足:共有ライブラリはAPIを介して動的にロードできます。ただし、そのAPIはバンドルのAPIとは異なり、セマンティクスによりdlopen()エミュレーションには使用できません。特に、共有ライブラリはアンロードできません。)[これはもはや真実ではありません—dylibsとバンドルの両方でdlopen()を使用できます。ただし、dylibはまだアンロードできません。]
ロード可能なモジュールは、Mach-Oで「バンドル」と呼ばれます。ファイルタイプはMH_BUNDLEです。関係するコンポーネントがそれを気にしないので、それらはどんな拡張も運ぶことができます。拡張子.bundleはAppleによって推奨されていますが、ほとんどの移植されたソフトウェアは互換性のために.soを使用しています。バンドルは、dyld APIを介して動的にロードおよびアンロードでき、そのAPIの上にdlopen()をエミュレートするラッパーがあります。[dlopenが優先APIになりました。]バンドルを共有ライブラリであるかのようにリンクすることはできません。ただし、バンドルが実際の共有ライブラリに対してリンクされている可能性があります。これらは、バンドルがロードされるときに自動的にロードされます。
OS Xで通常の共有ライブラリをコンパイルするには、-dynamiclibと拡張子.dylibを使用する必要があります。-fPICがデフォルトです。