2013-01-10 72 views
4

我有一個很大的iOS項目,它由幾個(大約20-30個)靜態庫組成,它們鏈接在一起形成最終的可執行文件。有些組件是平臺無關的(純C++),有些是iOS特有的(Obj-C/Obj-C++)。 C++模板被大量使用,因此每個目標文件都包含很多符號模糊的鏈接。問題是這些符號僅在最終可執行文件鏈接期間合併,而不是在製作靜態庫時合併。每個庫包含大量重複的符號(6-60克隆)。所以應用程序的最終鏈接需要幾分鐘的時間。這在調試和做一些小改動時變得非常煩人。用於ios項目的預鏈接靜態庫

有沒有辦法對每個庫進行模糊鏈接的符號合併?

我知道,這是在使用動態庫時自動完成的。通過一些黑客攻擊(http://sumgroup.wikispaces.com/iPhone_Dynamic_Library),可以爲iOS構建動態庫。有沒有辦法鏈接dylib的靜態(鏈接到一個單一的可執行文件)?

當然,能夠調試生成的應用程序是必須的。

+0

https://stackoverflow.com/questions/3276474/symbol-hiding-in-static-libraries-built-with-xcode-gcc – godspeed1024

回答

10

您可以將靜態庫對象預先鏈接到一個對象,也可以將其他靜態庫預先鏈接到一個靜態庫。它實際上將鏈接對象鏈接(幾乎就像在動態庫中)。

  1. 在您的單個庫(主要)中,轉到Build Settings並在Linking部分中找到Perform Single-Object Prelink。切換到是
  2. 在預鏈接庫中,您可以指定要包含的其他庫。在那裏你不僅需要輸入姓名,還需要輸入完整的文件名。如果其他庫也來自您的項目,那麼您可以使用$(CONFIGURATION_BUILD_DIR)變量。所以,如果你有foo庫,那麼這將是$(CONFIGURATION_BUILD_DIR)/libfoo.a
  3. 您可以添加單個對象預鏈接標誌的其他標誌
  4. 如果你想去掉局部符號,然後確保你有部署後處理設置爲Yes,因爲默認情況下靜態庫不會被刪除。