2013-05-08 44 views
26

我無法讓我的工作空間與Cocoapods正確編譯。有3個項目,在工作區中,每一個都有自己的目標:使用現有的靜態庫和iOS應用程序配置Cocoapods

  1. libPods - 的CocoaPods與所有的外部依賴
  2. libCommon靜態庫 - 我的靜態庫,我把我所有的共享代碼(基地控制器,網絡設備碼,常見的UI等)
  3. 對myApp - 我的iPhone應用程序

兩個libCommon和對myApp需要從libPods的外部依賴。本來我以爲會像這樣工作:

  1. libPods建立針對libPods
  2. libCommon聯繫,並建立
  3. 對myApp鏈路與libCommon並建立

在這種情況下libCommon 「擁有」 豆莢,然後myApp只是像libCommon一樣鏈接到libCommon,就像我一直在做Cocoapods之前一樣...但顯然靜態庫不喜歡與靜態庫鏈接(我有一堆動態庫錯誤)。我讀了一個github的問題,而不是我應該建立libPods和libCommon,然後我的應該鏈接兩個庫。現在我podfile看起來是這樣的:

workspace 'MyApp.xcworkspace' 
platform :ios, '5.0' 

link_with ['Common', 'MyApp'] 

target 'MyApp' do 
    xcodeproj 'MyApp.xcodeproj' 

    pod 'AFNetworking',    '1.1.0' 
    pod 'TTTAttributedLabel',   '1.6.0' 
    pod 'JSONKit',     '1.5pre' 
    pod 'Reachability',    '3.1.0' 
end 

有了這個設置,對myApp擁有所有的豆莢,然後在libCommon構建設置我指定的路徑莢頭。直到我嘗試使用libCommon中的其中一個類時,它纔會生成OK。一旦我這樣做,我得到其中一個_OBJC_CLASS_$_Blah錯誤(這告訴我,雖然頭可用,它仍然沒有正確鏈接)。當我嘗試在「Build Phases」中手動鏈接libCommon時,我得到一堆重複的符號錯誤(這讓我相信它已經鏈接了)。有沒有搞錯?

正確地做到這一點的方法是什麼,我的podfile應該是什麼樣子?

回答

10

CocoaPods創建一個默認的根目標,默認情況下鏈接到項目的第一個目標。在創建另一個目標時,link_with選項不會被子目標定義繼承,因此您的設置不起作用。爲了創建link_with選項,您可以將其移動到MyApp目標定義的塊中。

由於Common目標與Pod的鏈接,如果您將這些鏈接與MyApp關聯,則會導致重複的符號錯誤,因爲該應用與Common鏈接。在這種情況下,您只需使標題可用於MyApp目標。這很簡單,但目前還沒有一個合適的DSL,所以目前有點像一個解決方案(但支持)。

workspace 'MyApp.xcworkspace' 
platform :ios, '5.0' 

target 'Common' do 
    pod 'AFNetworking',    '1.1.0' 
    pod 'TTTAttributedLabel',   '1.6.0' 
    pod 'JSONKit',     '1.5pre' 
    pod 'Reachability',    '3.1.0' 

    target 'MyApp', :exclusive => true do 
    xcodeproj 'MyApp.xcodeproj' 
    end 
end 
+0

我不知道你如何快速回答cocoapods,法比奧,但只是一個說明,非常感謝!我之前有類似的問題,而'獨家'選項可以解決它。 – Stew 2013-05-09 23:26:55

+0

我按照你的建議設置了,並且MyApp目標編譯成功,直到我嘗試使用普通類(例如:添加以下行:MyObject * objectFromCommon = [[MyObject alloc] init];結果是_OBJC_CLASS_ $ _MyObject錯誤)。解析器/語法突出顯示雖然很好,但這使我相信這些頭文件可用,但該文件夾尚未鏈接。思考? – user2393462435 2013-05-10 21:26:31

+0

@ user2393462435,您需要手動將「Common」目標與框架構建階段中的「MyApp」目標鏈接起來(CocoaPods無法管理您的目標)。 – Fabio 2013-05-13 12:04:33

5

我對於這種情況採取的解決方案如下:

我成立了Podfile很簡單:

workspace 'MyApp.xcworkspace' 
platform :ios, '5.0' 

xcodeproj 'Common.xcodeproj' 

pod 'AFNetworking',    '1.1.0' 
pod 'TTTAttributedLabel',   '1.6.0' 
pod 'JSONKit',     '1.5pre' 
pod 'Reachability',    '3.1.0' 

target 'MyApp' do 
    xcodeproj 'MyApp.xcodeproj' 
    # specific dependencies 
end 

這樣共同lib和MyApp的設置是否正確使用所有的依賴關係。但是,這仍然會導致重複的符號。解決這個問題的方法是從Common項目的Build階段簡單地刪除libPods.a。這很好,因爲我們不是真的想鏈接到靜態庫的Cocoapods靜態庫。當您構建應用程序時,所有正確的依賴關係都會被鏈接,並且.xccconfig文件中將設置所有正確的標頭路徑,以便Xcode/AppCode仍將提供所有自動完成功能,並且所有內容都將被編譯。

每次運行pod install時都需要刪除libPods.a,這有點痛苦,但比手動管理所有依賴項更好。

更新:我正在寫這篇文章,並且我剛剛注意到不要使用鏈接器標誌Cocoapods設置在靜態庫中。默認情況下,我的靜態庫重寫了它們的值,但沒有任何值,但Cocoapods對此提出警告並建議使用$(繼承)。只要忽略它。

+0

您知道一種自動刪除的方法嗎?我想添加它,以便我的構建服務器可以在每次構建之前執行「pod安裝」。 – Wilmar 2013-10-25 14:31:12

+0

如果在同一個文件夾中有三個項目,你如何解決這個問題。 「MyApp-Core」,「MyApp-iOS」和「MyApp-Mac」? – Sunkas 2013-11-07 15:59:37

+0

我有一個問題,它說'沒有這樣的文件或目錄'爲Podfile.lock或Manifest.lock。此外,「沙盒與Podfile.lock不同步」 – 2015-07-15 19:55:21