Building Objective-C static libraries with categories(ObjC、all_load、force_load)

https://developer.apple.com/library/mac/qa/qa1490/_index.htmlphp

   之因此使用該標誌,和Objective-C的一個重要特性:類別(category)有關。根據這裏的解釋,Unix的標準靜態庫實現和Objective-C的動態特性之間有一些衝突:Objective-C沒有爲每一個函數(或者方法)定義連接符號,它只爲每一個類建立連接符號。這樣當在一個靜態庫中使用類別來擴展已有類的時候,連接器不知道如何把類原有的方法和類別中的方法整合起來,就會致使你調用類別中的方法時,出現"selector not recognized",也就是找不到方法定義的錯誤。爲了解決這個問題,引入了-ObjC標誌,它的做用就是將靜態庫中全部的和對象相關的文件都加載進來。html

原本這樣就能夠解決問題了,不過在64位的Mac系統或者iOS系統下,連接器有一個bug,會致使只包含有類別的靜態庫沒法使用-ObjC標誌來加載文件。變通方法是使用-all_load 或者-force_load標誌,它們的做用都是加載靜態庫中全部文件,不過all_load做用於全部的庫,而-force_load後面必需要指定具體的文件。xcode

-ObjC: app

This flag causes the linker to load every object file in the library that defines an Objective-C class or category. 函數

While this option will typically result in a larger executable (due to additional object code loaded into the application), this

it will allow the successful creation of effective Objective-C static libraries that contain categories on existing classes. .net

這個flag告訴連接器把庫中定義的Objective-C類和Category都加載進來。這樣編譯以後的app會變大(由於加載了其餘的objc代碼進來)。 code

可是若是靜態庫中有類和category的話只有加入這個flag才行。htm

-all_load 對象

IMPORTANT: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes.

The workaround is to use the -all_load or -force_load flags. -all_load forces the linker to load all object files from every archive it sees, even those without Objective-C code.

-force_load is available in Xcode 3.2 and later. It allows finer grain control of archive loading. Each -force_load option must be followed by a path to an archive,

and every object file in that archive will be loaded.

這個flag是專門處理-ObjC的一個bug的。用了-ObjC之後,若是類庫中只有category沒有類的時候這些category仍是加載不進來。變通方法就是加入-all_load或者-force-load。-all_laod會強制連接器把目標文件都加載進來,即便沒有objc代碼。

-force_load在xcode3.2後可用。可是-force_load後面必須跟一個只想靜態庫的路徑。

 

一個不錯的連接:http://www.dutor.net/index.php/2012/02/what-linkers-do/

相關文章
相關標籤/搜索