2013-10-02 165 views
3

A是一個模塊項目。有一些測試目標,相關的可重用代碼被編譯在一個單獨的(靜態庫)目標中。 A使用第三方伐木工人日誌庫。伐木工人的代碼只是簡單地放到了項目中。重複符號(工作區中的兩個項目使用相同的代碼)

B是一個不同的模塊項目,但除此之外它具有與A相同的屬性。

C是主要項目。它取決於AB。它鏈接了AB的庫。

編譯C將導致重複的伐木工符號。

怎樣纔可以有多個獨立的模塊項目,使...

  1. 他們不知道相互的,
  2. 使用相同的第三方代碼,
  3. 可以編譯和測試在自己的主項目中包含
  4. 沒有重複問題?
+0

這聽起來是難治與目標c命名空間。 [http://stackoverflow.com/questions/15539041/how-does-one-use-namespaces-in-ios-objective-c-code][1] [1]: http://stackoverflow.com/questions/15539041/how-does-one-use-namespaces-in-ios-objective-c-code –

+0

只要是明確的,與這兩個A''和'B'參考伐木工人符號完全相同的功能,正確嗎?或者它們是否引用了具有不同功能的不同類似名稱的符號? –

+0

「A」和「B」都引用完全相同的第三方庫(伐木工人)。因此,不管怎樣,我都必須讓他們以一種獨立編譯的方式共享該庫。我希望這是有道理的。 – DrummerB

回答

1

由於您的目標是OSX,因此解決您的問題的方法是將Lumberjack作爲框架(而不是鏈接A和B模塊中的源代碼),然後在需要的地方使用該框架(即任何項目使用A或B模塊)。

事實上,Lumberjack已經包含了一個建立Lumberjack.framework的項目,請檢查:CocoaLumberjack/Xcode/LumberjackFramework/Desktop/Lumberjack.xcodeproj

詳細闡述了這一點,您可以像現在這樣定義您的A和B模塊,但不會丟棄伐木工人的源代碼。相反,當你想要在可執行文件(比如測試目標)中使用靜態庫時,你需要將庫添加到目標以及lumberjack框架中(就像你使用OSX SDK框架一樣)。

如果需要,添加動態框架只是「刪除源」的一種不同方式,但要正確完成。

當你想使用 A和B在C項目,添加靜態庫和你的伐木工人框架下

正如你所看到的,這樣做的這種方式將遵守所有四個要求,代價是引入一個依賴項:您需要在靜態庫文檔中明確說明它們依賴於伐木工人框架。這實際上不是一個大問題,因爲後者在自己的項目中可用,任何人都可以自己構建。

如果你想改善對這個依賴關係的處理,cocoapods就是要走的路(cocoapod是一個與你的庫相關的文件,它描述了它的依賴關係,所以當你安裝你的庫時,cocoapods系統會自動安裝也依賴)。但是這是非常可選的。一個單一的依賴並不是要記錄或遵守的大問題。

希望這回答你的問題。

+0

雖然不完美,但我認爲這是解決此問題的最佳方案。我能夠成功編譯一個測試設置,然後我會寫出一些有關細節的答案。考慮到我的子模塊無論如何都是私有的(不會被公開發布),我可以忍受附加依賴。 – DrummerB

+0

[這](http://stackoverflow.com/a/19317241/343340) – DrummerB

+0

我的問題是非常* *相似,但這種扭曲:'X'是主項目; 'Y'是一個庫(Cocos2d),作爲目標依賴項添加*。*'Z'是我的預編譯框架。 'X'需要'Z'和'Y'需要'Z'(我調整了cocos2d,略。)'Y'(cocos2d的)包含在'X'作爲一個框架(沒有來源。)我有重複的符號。我無法弄清楚如何改變你的答案來解決我的問題。 **幫助!!! **謝謝! :) – Olie

1

我討厭引用現有的答案,但這裏有一個解決方案,它笨重,但工程:What is the best way to solve an Objective-C namespace collision?

我有同樣的問題,我雖然工作在一個更好的解決方案。另一個想法可能工作,但我不知道如何實現它我在這裏問:Selectively loading classes in Objective-C

第三個想法,因爲有人在我的問題上說的東西是將一個庫包裝在一個框架中,並創建函數引用你需要的函數。然後加載使用類似#import <myFramework/MFMyAliases.h>

+1

將第三方代碼放在動態框架中是不可能的,類似於蘋果的框架如何在多個相關項目中導入和鏈接而沒有問題? – DrummerB

+0

也取決於他的目標是什麼平臺。伐木工人並不是蘋果專有的。如果不是Apple,則有更多選項可用。 –

+1

我的目標是OS X.以爲這將從標籤中清楚,但我也會加上。 – DrummerB

0

AB二進制文件?

如果不是,您可以簡單地取消選中其中一個項目的所有*.m文件的編譯複選框,以避免構建重複的對象。

另外,如果你可以使用AB徹底Cocoapods這將是最好的。

0

嘗試this

它在不同的項目之間共享庫/模塊。

1

您是否試過用ar來查看庫?如果你是非常幸運的,例如運行

ar -t libA.a 

給你喜歡

__.SYMDEF SORTED 
Afile1.o 
Afile2.o 
Lumberjack1.o 
Lumberjack2.o 
Afile3.o 
SomeOtherLibrary.o 

當伐木工人文件顯然與其餘可分離的文件列表。然後,您可以在單獨測試A當使用全庫

a -d Lumberjack1.o Lumberjack2.o 

和鏈接C他們踢出去 反對這種修剪庫。

1

我在幾個月前試圖實現同樣的事情,「Easy, Modular Code Sharing Across iPhone Apps: Static Libraries and Cross-Project References」文章得到了我所需要的一切。請檢查出它是否有用。

+0

我不認爲這種方法足夠靈活。據我所知,它使用硬編碼路徑(在源樹選項卡中)。對於項目的某些部分,這不需要固定路徑嗎?即我無法將他們簡單地轉移到其他地方,或將其發送給同事。 – DrummerB

2

因此,爲了詳細闡述塞爾吉奧的answer,我能夠成功地建立如下測試設置。

  1. 我將Lumberjack代碼包含在一個單獨的項目中,該項目將Lumberjack構建爲一個靜態庫。
  2. 我創建了一個新的項目項目A的靜態庫目標ModuleA和測試應用程序的目標DemoA。我將Lumberjack項目文件夾複製到ProjectA的項目文件夾中,然後將其作爲子項目添加。我沒有讓ModuleA依賴於伐木工人或鏈接伐木工人在模塊A。相反,我製作了DemoA依賴於兩者並鏈接這兩個庫。這樣,我就能夠編譯測試目標,但庫目標不包括伐木工人。
  3. 我創建了第二個項目ProjectB,模擬設置爲ProjectA
  4. 在主項目中,我包括ProjectA,ProjectB和Lumberjack作爲子項目。不幸的是,這會讓Lumberjack在主項目中包含3次,這有點不方便和醜陋(例如,當選擇依賴目標時,你無法確切知道哪個是哪個目標)。
  5. 最後,我做了主要項目的目標依賴於伐木工人,模塊A模塊B並鏈接所有三個庫。現在,主項目可以編譯而不會出現重複的符號錯誤,子模塊也可以自行編譯和測試。
相關問題