2012-07-10 83 views
3

我是新來建立靜態庫,並希望創建2(+)庫,其中每個庫都有一些獨特的代碼和一些共享的代碼。我的意圖是其他項目將鏈接一個或多個這些靜態庫。如何跨靜態庫共享代碼而不出現重複符號錯誤?

Util.h/m <-- Shared 
ImplOne.h/m <-- Unique to 'ImplOne' 
ImplTwo.h/m <-- Unique to 'ImplTwo' 

我使用的XCode並且通過在一種情況下建立和Util.m生成ImplOne.m的庫,並且在其他Util.mImplTwo.m

當然,問題是我現在不能將這些庫一起使用,因爲它們會有重複的符號。對於這種情況,什麼是更好的架構?

+0

使它成爲三個庫,共享implone和impltwo的util。 – dasblinkenlight 2012-07-10 03:14:53

+0

@dasblinkenlight想到這一點,它會工作......是唯一的方法?也許是。 – 2012-07-10 03:16:05

+0

這可能是最乾淨的選擇。您可以使用宏來改變函數和變量的名稱,但結果看起來不會很漂亮。 – dasblinkenlight 2012-07-10 03:20:54

回答

3

我認爲最簡潔的選擇是爲共享的Utils.h/m製作一個單獨的庫。缺點是您的用戶需要鏈接utils以及implone和/或impltwo,並且爲了將impooneimpltwo鏈接在一起,兩個庫都需要使用相同版本的utils進行編譯。作爲回報,圖書館的來源將保持良好和乾淨。

另一種方法是使用宏來更改utils中的函數和變量名稱以避免鏈接器錯誤。其中最重要的結果是代碼重複:imploneimpltwo都會鏈接不同名稱下的相同代碼段。另一個是可讀性:它會受到巨大的影響,因爲每個對utils函數的引用都需要用宏包裝。這使得第二種方法變得很髒,所以我肯定會推薦使utils成爲一個單獨的庫。

2

我在當前代碼庫中遇到類似的問題。我的解決方案與我在寫這篇文章時得到的答案類似,但我將它作爲比較/參考放在此處。

我有一個共同的靜態庫項目(我們稱之爲libCommonBits.a)。我有第二個靜態庫,裏面有一些UI代碼(我們稱之爲libCommonUI.a),這也取決於libCommonBits.a。我的主應用程序需要使用這兩個庫。

我的解決方案是不實際將libCommonBits.a鏈接到libCommonUI.a。它針對頭文件進行編譯,只是意味着我的主應用程序鏈接兩個靜態庫而不是一個。

我希望這種方法是由更多的人分佈圖書館採取。當您使用已經鏈接到公共庫(JSONKit或類似庫)的靜態庫時,您會感到沮喪,並且您也可以在代碼庫中單獨使用它。在這種情況下,符號重命名可能是唯一的解決方案。

+0

+1提醒人們不要鏈接到公共圖書館。 – 2012-07-10 15:58:28