[解決済み】macOSの.soと.dylibの違いは何ですか?
質問
.dylibはmacOSのダイナミックライブラリ拡張ですが、従来のunixの.so共有オブジェクトを使えない/使うべきではない場合というのは、これまで明確には分かっていませんでした。
疑問に思っていることをいくつか。
- 概念的には、.soと.dylibの主な違いは何ですか?
- どのような場合にどちらを使うべきですか?
- コンパイルのコツとヒント(例えば、gcc -shared -fPICはOSXでは動作しないので、その代わりとなるものなど。)
解決するには?
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
フラグをコンパイラに設定します。
dylibs と bundles の両方が動的に読み込まれるようにするには
dl
API(例.
dlopen
,
dlclose
). バンドルに対して、あたかも共有ライブラリのようにリンクすることはできません。しかし、バンドルが実際の共有ライブラリに対してリンクされることはありえます;それらはバンドルがロードされるときに自動的にロードされます。
歴史的には、もっと大きな違いがあった。 Mac OS X 10.0では、ライブラリを動的にロードする方法はありませんでした。 dyld API のセット (例.
NSCreateObjectFileImageFromFile
,
NSLinkModule
) はバンドルのロードとアンロードのために 10.1 で導入されましたが、dylibs では動きませんでした。 A
dlopen
バンドルで動作する互換ライブラリが 10.3 で追加され、10.4 では
dlopen
はdyldのネイティブな部分として書き直され、dylibのロード(アンロードは不可)のサポートが追加されました。最後に、10.5 では
dlclose
をdylibsと一緒に使用し、dyldのAPIを非推奨としました。
Linux などの ELF システムでは。 は同じファイル形式を使用します。 共有コードはライブラリとして、またダイナミックローディングのために使用することができます。
最後に、Mac OS Xでは、注意が必要です。 "バンドル" できる また は、実行可能なコードとそのコードによって使用されるリソースを保持する標準的な構造を持つディレクトリを指します。 概念的には重なる部分がありますが(特にプラグインのようなquot;loadable bundles"は一般にMach-Oバンドルの形で実行可能コードを含む)、上で述べたMach-Oバンドルと混同されるべきではありません。
その他の参考文献
- Finkポーティングガイド は、この回答の根拠となるものです(ただし、Mac OS X 10.3用に書かれたものなので、かなり古くなっています)。
- ld(1) と dlopen(3)
- ダイナミックライブラリ・プログラミングのトピックス
- Mach-O プログラミングトピックス
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] time(1) の出力における 'real', 'user' および 'sys' はどのような意味ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】デバッグアサーションに失敗しました