2014-03-02 56 views
5

我已經構建了一個靜態庫,我是我的iOS二進制文件鏈接的代碼剝離已關閉等靜態庫,我可以看到符號在檔案中(通過nm)。保持Xcode從靜態庫中剝離出未使用的符號

因此,我將該庫作爲框架鏈接到我的應用程序中。但是,我並不直接調用該函數。因此,我可以直接看到我在二進制文件中調用的符號,但不能調用那些未調用的符號。但是,因爲我實際上希望這些符號在運行時存在,所以我正在使用-all_load進行編譯。

但是,這似乎給圖書館的用戶帶來了不必要的負擔。有什麼我可以添加在靜態庫中,強制執行此操作,而不是依賴庫的用戶?

+0

也許你可以舉一個例子說明你爲什麼需要整個庫加載?有很多方法可以讓鏈接器做你想做的事情(其中一些非常簡單),但可能會有更優雅的解決方案來解決你的問題。 –

+0

我想註冊組件來處理某些類型。我的庫有一些標準類型的標準組件。客戶可以爲其特定類型創建更多組件並註冊它們。 每個組件只是註冊自己來處理一個類型。所以,當它被「加載」(通過+ load或__attribute __((構造函數)))時,它會註冊自己。但是,在靜態庫中,由於沒有明確調用組件的代碼,所以組件永遠不會實際註冊自己。 – Masa

回答

0

取決於你所要完成的,你可以精確地控制哪些符號是死剝離並總是被載入,即使庫的用戶實際上並不使用它們是什麼。

最簡單的方法是創建一個庫初始化函數,該函數引用您不希望死去的精確符號。這是準確的,並且可以節省您使用鏈接器命令行選項進行摔跤的負擔,這可能會使您免受工具行爲變化(不太可能)的影響。

框架具有自動初始化器(非常方便),可以在運行時加載框架時自動調用,在任何靜態變量初始化之後立即執行。

__attribute__((constructor)) 
static void MyModuleInitializer() 
{ 
    static BOOL initialized = NO; 
    if (!initialized) { 

     // References to symbols that should be kept around. 

     initialized = YES; 
    } 
} 

只是爲了笑容,自動終結也在利用__attribute__((destructor))裝飾的支持。

+0

但我不想有一個全局初始化,必須知道庫的其他部分。 如果必須有一些中央初始化,那麼實際上並不需要使用__attribute __((構造函數)) - 只是調用我想要保留的符號的函數。 – Masa

+0

也許我在這裏錯過了一些東西。 :-)你是說你想讓你的_clients_創建額外的組件作爲靜態庫,只是奇蹟般地喚醒並在運行時在_your_靜態庫中自動註冊組件? –

+0

當然,除了提供的API外,他們還可以使用API​​創建更多的組件。 – Masa