2012-01-17 114 views
1

我是一名新的iOS開發人員。我有一個非常基本的疑問。我在很多地方閱讀過,我們需要將我們的.h文件和.a文件一起發送給靜態庫。靜態庫中.h文件的意義是什麼?

而.a文件是編譯庫,具有完整的實現,開發人員無法自己閱讀,只是爲了實現安全的實現代碼。

而我們需要.h文件來知道哪些公共功能可用。但爲什麼Xcode不能解碼.a文件並直接使用它而不是運送另一個.h文件。 Xcode不需要向開發人員展示.a實現,而是可以向開發人員提供公共可用的方法。

我沒有看到蘋果沒有這樣做的任何邏輯原因。我相信,運送.h文件絕對有很強的理由。我想知道可能是什麼原因?

回答

5

.a文件只是一個或多個.o(對象)文件的存檔。對象文件包含已編譯的機器代碼(針對特定CPU架構下的一個特定操作系統)。原始源代碼是「丟失」。

您可能不知道的事實:對象文件可以包含從任意編程語言編譯的二進制文件。一個.h文件是C/C++/Objective C特​​有的。它包含數據類型和函數原型,您需要能夠在C/C++/Objective C中的目標文件中使用包含在二進制形式中的函數/數據類型/ ...。編寫一個Pascal庫,將其編譯爲.a文件,並使用適當的頭文件(.h)在Objective C程序中使用該代碼。

您也可以只有一個頭文件(.h文件),但例如, 6個不同的.a文件:一個針對Mac OS X 64bit編譯,一個針對Mac OS X 32bit,一個針對Linux 2.6 64bit,一個針對Linux 2.6 32bit,一個針對FreeBSD,最後一個針對OpenBSD

最後但並非最不重要的是,蘋果公司決定不這樣做,.a.o文件可以在(至少)任何類Unix操作系統上找到,並且頭文件是C中的標準,因爲第一天。

通常,如果將一個庫從Mac移植到Linux,則可以使用(大部分)代碼和頭文件,但必須編譯包含爲Linux編譯的對象文件的單獨.a文件。

+0

感謝您的詳細回覆。但仍然是.a代碼是架構特定的,爲什麼編輯器不能讀取.a文件,並向我們展示可用的公共函數,因爲在執行期間,可執行文件能夠鏈接靜態庫中所需的函數。所以爲什麼編輯不能做到這一點。 這只是爲了我的邏輯理解。 – 2012-01-17 14:31:52

+0

從'讀取函數的名字非常簡單。o'文件(所以'.a'文件也很簡單),但是:你不能很容易地知道函數有多少種類型的參數和返回值! ABI(應用程序二進制接口)定義瞭如何處理參數,通常它們只被一個接一個地壓入堆棧。 '.o'文件中的機器代碼然後從那裏加載數據。但總是對此進行逆向工程並不容易。 – 2012-01-17 14:35:53

+0

真正有用.. :) – turtle 2013-08-01 05:15:28

0

.a文件是編譯的.c,.c++,.m等文件的集合。對這些文件進行編譯只是爲了獲取函數的名稱/簽名將a)在道德/隱私的基礎上是狡猾的,b)需要做大量的工作。 .a文件不是字節碼或類似的易於反向工程的東西 - 它們是機器碼。

即使您對這些已編譯文件的「源」進行了反向工程,它們也不會包含實際的方法名稱,簽名或任何可識別的內容。

相關問題