2013-01-21 34 views
2

所以我在過去幾次嵌套靜態庫,但從來沒有像這樣,它導致了一些問題。複雜的靜態庫鏈接

現在讓我們假設我有3個靜態庫A,B和C.以及一個使用它們的項目,如下所示。

A是由常用自定義視圖,數據結構和類別組成的基本庫。 B是一個與A鏈接的庫,它包含幾個項目之間共享的視圖控制器。 C是與A鏈接的另一個庫,其中包含在幾個項目中共享的視圖控制器。

這個特殊的項目使用的代碼從B和C.因此,結構是這樣的:

A 
/\ 
B C 
    \/
Project 

而且由於Xcode的鏈接靜態庫基本上將它們合併的方式,B和C都具有A的所有符號。所以我得到了重複符號鏈接器錯誤。我該如何處理這個問題?我需要弱連結某些東西嗎?或者是否有我失蹤的特殊標誌?我是否需要設置其他感謝鏈接二進制文件的某種類型的依賴關係?

我已經搜索了一下,在這裏搜索,發現很多很好的信息,但沒有任何我能夠扭轉到這種特殊情況。在思考

更新,以便讓我問這個,因爲它似乎是讀取靜態庫,而能夠被合併真的不應該後可能的解決方案。

而不是有3個獨立的靜態庫,我應該把它們全部放在一個項目中,只有多個靜態庫目標?甚至不使用目標依賴關係,僅僅是A,AB和AC以及ABC目標,它們包含適當目標的文件和標題?這對於構建設置來說無疑是相當複雜的,並且可能會使源代碼分發有點複雜,但它可以解決我目前的問題,並且可能是更好的處理方法。 Whatcha認爲?

+0

爲什麼'B'和'C'包含'A'的符號?這聽起來不對。 – trojanfoe

+0

因爲它們是鏈接庫。 –

+0

但是,如果'B'是靜態庫,'A'是靜態庫,那麼'Project'必須與'A' **和**'B'連接。換句話說'B'不包含'A'直到與二進制的最終鏈接。 – trojanfoe

回答

2

看起來沒有創建靜態庫BC正確,你是從靜態庫A包括目標文件。這是不正確的。取而代之的是,A,BC僅包含其自己的類的目標文件,並將它們全部放在Project二進制文件的最終鏈接中。

  • 你將不得不讓B看到,以正確編譯A的頭文件。

  • 您必須允許C才能看到A的頭文件才能正確編譯。

  • 你將不得不讓Project看到A的,B的和C的頭文件,以編譯正確以及A的,B的和C的圖書館(.a)文件以正確鏈接。

認爲是一個Xcode工作區會照顧所有的頁眉/庫搜索路徑設置爲你,一旦你建立項目依賴正確的,但我可能是錯了,你可能必須自己設定這些路徑。

+0

謝謝。 Xcode的工作空間一定會處理得非常好。 –