web-dev-qa-db-ja.com

Xcodeプロジェクトのターゲットビルド設定で、Mach-Oタイプとは何ですか?

たくさんのMatch-Oリンカーエラーにうんざりした後、私はこれが意味することを知りたいです。試行錯誤の代わりに、これらの背後にある概念を知りたいと思います。具体的には、次の違いを知りたいです。

  1. 実行可能
  2. ダイナミックライブラリ
  3. バンドル
  4. 静的ライブラリ
  5. 再配置可能オブジェクトファイル

これらは、リンクセクションのMach-Oタイプ設定をクリックしたときに表示されるオプションです。いくつかの小さな定義または適切なコンテンツへのリンクも問題ありません。

21
Max

Mach-O 、Machオブジェクトファイル形式の略で、実行可能ファイル、オブジェクトコード、共有ライブラリ、動的にロードされるコード、およびコアダンプのファイル形式です。 UNIXユーザーの場合、これはa.outに似ていますが、改善されています。これは、Mac OSXおよびiPhoneOSライブラリで実行可能ファイルに使用される形式です。

ご存知のように、iOSデバイス(iPhone、iPadなど)のアーキテクチャはARMv6(iPhone 2G + 3G、iPod Touch)とARMv7(iPhone 3GS、iPod Touch 2G + 3G)ですが、Xcodeで使用されるシミュレーターは主にi386プラットフォームで動作します。これは、ライブラリクライアントがシミュレータとデバイスに別々のターゲットを設定する必要があることを意味します。個別のターゲットはほとんどの情報を複製し、含まれている静的ライブラリのみが異なります。したがって、Mach-Oリンカーエラーが発生した場合、xcodeがそのターゲットデバイスのライブラリの1つにリンクするのに問題があることを意味します。その結果、コンパイルは失敗します。

今あなたの定義-

  1. 実行可能ファイル-バイナリ形式で実行する準備ができているコンパイル済みのマシンターゲットプログラム。
  2. ダイナミックライブラリ-実行時にリンクされます-ダイナミックライブラリへの参照を持つプログラムは、起動時に(またはオンデマンドで)ライブラリをロードしてリンクします。
  3. バンドル-バンドル識別子により、iOSとOSXはアプリのアップデートを認識できます。それはそれにアプリでユニークな存在感を与えます。
  4. 静的ライブラリ-ファイルはビルド時にリンクされます。コードが実行可能ファイルにコピーされます。プログラムによって参照されていないライブラリ内のコードは削除されます。静的ライブラリのみを持つプログラムには、実行時に依存関係はありません。
  5. 再配置可能オブジェクトファイル-ダイナミックライブラリのもう1つの単語です。ダイナミックライブラリとリンクすると、ライブラリがメモリ内のどこにロードされているかに基づいて、そこに含まれる関数のアドレスが計算されます。含まれている関数のアドレスはリンク時に決定されないため、これらは「再配置可能」です。 (静的ライブラリでは、アドレスはリンク時に計算されます。)
33

Appleドキュメント、

Mach-O Type Definition

詳細については、これを確認してください Mach-Oファイルのビルド および Xcodeビルド設定リファレンス

6
iDev
Framework target -> Build Settings -> Mach-O Type

Xcodeヘルプには次の説明があります

Mach-Oタイプ(MACH_O_TYPE)【Mach-Oファイル】

この設定は、生成されるバイナリの形式と、他のバイナリを構築するときにリンクする方法を決定します。

  • 実行可能ファイル:mh_execute。実行可能ファイルとスタンドアロンバイナリであり、リンクすることはできません。

  • ダイナミックライブラリ:mh_dylib。ダイナミックライブラリはビルド時にリンクされ、必要に応じて自動的にロードされます。

  • バンドル:mh_bundle。バンドルライブラリは、実行時に明示的にロードされます。

  • 静的ライブラリ:staticlib。静的ライブラリはビルド時にリンクされ、実行時にロードされます。

  • 再配置可能オブジェクトファイル:mh_object。オブジェクトファイルは、ビルド時にリンクされる単一モジュールファイルです。

0
yoAlex5