2015-06-19 58 views
1

我有一個包含自定義框架的項目,但這些自定義框架還包括自定義框架。iOS和Xcode如何鏈接自定義框架

下面是一個示例結構,其中,所述子彈是包括框架:

應用

  • FrameworkA

  • FrameworkB

  • FrameworkC

FrameworkA

  • FrameworkC

FrameworkB

  • FrameworkC

由於FrameworkA和FrameworkB鏈接FrameworkC,沿着我的應用程序使用框架A,B,和C;它們是全部鏈接在一起還是被複制到多個地方的框架?

這是否增加了應用程序的大小?

在這個例子中,FrameworkC擁有資產,如果它被複制多次不會不必要地重複數據?或者有更好的方法?

回答

1

iOS框架是頭文件和胖靜態歸檔庫的集合。 iOS不支持包含共享庫的框架。

胖胖的靜態歸檔庫是多架構對象文件的集合,可以根據鏈接器的需要提取對象文件以創建可執行的工件。 iOS可執行文件是自包含的可執行文件(系統庫是共享對象除外)。

脂肪檔案可以用lipo進行檢查。

cd FrameworkA.framework 
lipo -info FrameworkA 
Architectures in the fat file: FrameworkA are: armv7 armv7s i386 arm64 

當你創建一個框架,連接器工具不能使用,因爲框架(在你的情況FrameworkA和FrameworkB)是不可執行的假象。依賴框架包含在框架項目中,因爲編譯器需要頭文件來創建框架A和B對象文件。在frameworkC中對符號的任何引用都沒有解決。

如果您使用「lipo」和「ar」工具檢查FrameworkA或FrameworkB的內容並提取目標文件,然後使用「nm」轉儲目標文件符號,您會注意到對FrameworkC中符號的任何引用仍然存在懸而未決。

注意:您需要安裝Xcode命令行工具來執行此操作。

cd FrameworkA.framework 
lipo FrameworkA -thin armv7 -output FrameworkA_armv7.a 
ar -t FrameworkA_armv7.a 
objectA1.o 
objectA2.o 
objectA3.o 

ar -x FrameworkA_armv7.a objectA1.o 
xcrun --sdk iphoneos nm -p objectA1.o 
... 
00000188 T FrameworkAFunction 
     U FrameworkCFunction 
... 

這就是爲什麼當你創建一個應用程序,你需要的所有三個框架(A,B和C)包含在項目中。當鏈接器在其中一個App對象文件中讀取未解析的符號時,它將搜索框架A和B.當符號解析後,它將從包含該符號的存檔中讀取整個對象文件。鏈接器必須解析該對象中任何未解決的相關符號。如果這些未解決的標誌之一,是FrameworkC,它會拉入含FrameworkC

依賴符號因此,要回答你的問題的對象:

框架A,B和C,當應用程序被鏈接的聯繫,只有將解析所有符號所需的對象從框架複製到應用程序可執行文件中。

是的,複製對象會增加可執行文件的大小,但不會有任何對象的多個副本。

當最終的應用包由xcode組裝時,FrameworkC中的資源只被複製一次。

+0

謝謝!非常有用的知道。 –

+0

很高興幫助。 – BitByteDog