2012-07-31 173 views
12

我目前有一個非常大的代碼庫的單個Xcode項目,我將其稱爲項目X,我將其分成一堆子項目(項目A ,B,C)。鏈接靜態庫,共享另一個靜態庫

到目前爲止,這些項目中的每一個都自行編譯就好了。他們都產生靜態庫。 項目B項目C依賴於生成的靜態庫項目A爲了構建。

我有另外一個xcode項目,項目ž,需要通過項目B和C產生的靜態庫。這就是問題所在。當項目Z進入鏈接器階段時,事情就會爆炸 - 對於項目B和C,它們原先鏈接的代碼在項目A中找到重複的符號!

我是很新,靜態庫的世界,我不能確定如何與項目ž前進,或如何修改其他項目,使他們鏈接對同一A計劃 lib。我有一種感覺,這是不可能的。我在這裏有什麼選擇?

編輯:

我要澄清的是項目B項目C需要建設成單獨的靜態庫,因爲某些客戶端將只需要一個或另一個。

另外,我在OSX和iOS平臺上都遇到了這個困境。

我意識到我可以通過將項目構建爲動態庫來解決OSX上的這個問題。不過,我寧願不這樣做,它仍然讓我在iOS上遇到同樣的問題。

回答

16

靜態庫不應該包含其他靜態庫(或通常的第三方代碼)。一個靜態庫只是一堆粘在一起的.o文件。所以如果你有相同信息的多個副本,它會炸燬。

每個靜態庫應該只有它自己的代碼。最終的應用程序負責將所有必需的庫鏈接在一起(包括庫所需的庫)。通過這種方式,每件事物都有一個鏈接。

+1

是的,你說得對。 我解決了這個問題,只是沒有將項目B和項目C鏈接到項目A.項目B和C仍將項目A作爲依賴項引用,因此它們能夠很好地構建。由於客戶將始終將項目A與這些項目並列在一起,因此所有符號都可以找到並且工作起來。 – Jeff 2012-08-01 19:28:19

+0

@Jeff你是如何使A成爲「依賴」的,這樣其他人可以構建,而不是實際連接到(包括)A的構建中? – johnbakers 2016-04-30 13:39:24

+1

@Rob我注意到,在Xcode中,如果我構建的靜態庫僅包含到另一個庫的頭,但沒有鏈接到其他庫的二進制文件,則構建完成。如果我用一個實際的程序項目(而不是一個庫)來做這件事,那麼在鏈接階段有一些未定義的定義(錯誤)。我假設當你建立一個圖書館時,「跳過」鏈接階段的這部分是正常的,而實際的程序在建立時會做額外的鏈接檢查,是嗎? (如果它被指示構建一個庫,編譯器實際上會做什麼?) – johnbakers 2016-04-30 14:38:45

2

這聽起來像是CoacoaPods被創建來解決的問題。如果您爲每個項目定義窗格,則Z應該能夠確定並鏈接所有的依賴關係,而不會引入重複的符號。