2012-10-26 28 views
13

在厭倦了衆多的Match-O鏈接器錯誤之後,我想知道這個東西的含義。我想知道這些事情背後的概念,而不是嘗試和錯誤的解決方案。具體來說,我想知道的區別:在Xcode項目目標版本設置中,什麼是Mach-O類型?

  1. 可執行
  2. 動態庫
  3. 捆綁
  4. 靜態庫
  5. 浮動對象文件

這些選項呈現,當我點擊在鏈接部分的Mach-O類型設置。一些小的定義或一些適當的內容的鏈接也沒關係。

+3

https://開頭developer.apple.com/library/mac/#documentation/developertools/conceptual/MachOTopics/1-Articles/building_files。html – iDev

回答

22

Mach-O是Mach目標文件格式的縮寫,是可執行文件,目標代碼,共享庫,動態加載代碼和核心轉儲的文件格式。對於unix用戶,這與a.out類似,但有所改進。這是Mac OS X和iPhone OS庫中用於執行文件的格式。如你所知,iOS設備(iPhone,iPad等)有不同的架構ARMv6(iPhone 2G + 3G,iPod Touch)和ARMv7(iPhone 3GS,iPod Touch 2G + 3G),但Xcode中使用的模擬器主要運行於i386平臺。這意味着庫客戶端必須爲模擬器和設備設置單獨的目標。單獨的目標重複大部分信息,並且僅在所包含的靜態庫中有所不同。因此,如果您遇到Mach-O鏈接器錯誤,那麼意味着xcode無法鏈接到該目標設備的某個庫;因爲編譯失敗。

現在你的定義 -

  1. 可執行文件 - 編譯機有針對性的程序準備以二進制格式中運行。
  2. 動態庫 - 在運行時鏈接 - 引用動態庫的程序將在啓動(或按需)時加載並鏈接庫。
  3. 軟件包和軟件包標識符讓iOS和OSX可以識別您的應用程序的任何更新。它賦予了它在應用程序中的獨特存在。
  4. 靜態庫 - 文件在構建時鏈接。代碼被複制到可執行文件中。庫中未被程序引用的代碼被刪除。只有靜態庫的程序在運行時沒有任何依賴關係。
  5. 可重定位的對象文件 - 是動態庫的另一個詞。當您與動態庫鏈接時,將根據庫在內存中的加載位置計算其中包含的函數的地址。它們是「可重定位的」,因爲包含的功能的地址不是在鏈接時確定的。 (在一個靜態庫,地址在被鏈接時計算。)
+0

我在類似主題上尋求您的建議,不知道如何與您聯繫。我會很樂意根據您的要求發佈一個問題。 – Patricia

+0

你確定「Relocatable Object File」是動態庫的另一個詞嗎? AFAIK,它是目標文件(它在使用時是靜態鏈接的 - 所以這是靜態靜態庫的另一種形式)。雖然靜態庫包含多個對象,但可重定位對象文件是單個對象。 – Krypton

+0

我認爲它與ELF可重定位目標文件不同。有人可以複覈嗎? – Krypton

相關問題