cocoapods導致的符號重復問題分析和解決
xplayer工程用了Pods,xplayerdemo_pods工程引用xplayer時又用了Pods,導致如下的鏈接錯誤:
duplicate symbol _OBJC_METACLASS_$_PodsDummy_Pods
類似:
duplicate symbol _OBJC_METACLASS_$_PodsDummy_Pods in:
/Users/erikkerber/Dropbox/Projects/MillMain/MyLib.framework/BuddySDK(Pods-dummy.o)
/Users/erikkerber/Library/Developer/Xcode/DerivedData/MillMain-fngfqhlslygksgcfuciznkpqfrbr/Build/Products/Debug-iphonesimulator/libPods.a(Pods-dummy.o)
duplicate symbol _OBJC_CLASS_$_PodsDummy_Pods in:
/Users/erikkerber/Dropbox/Projects/MillMain/MyLib.framework/BuddySDK(Pods-dummy.o)
/Users/erikkerber/Library/Developer/Xcode/DerivedData/MillMain-fngfqhlslygksgcfuciznkpqfrbr/Build/Products/Debug-iphonesimulator/libPods.a(Pods-dummy.o)
ld: 2 duplicate symbols for architecture i386
**********************嘗試刪除**********************
一種辦法是把demo工程裡Link Binary with Libraries裡的libPods.a的引用刪除即可。
但是這個方法無法用於自動構建,得尋找其他方案。
我們來看符號重復的原因:
xplayer這個靜態庫工程用了Pods,所以編譯鏈接了Pods-dummy.m文件。
而xplayerdemo_pods又用了Pods,又編譯鏈接了新的Pods-dummy.m文件。
導致了PodsDummy_Pods這個類重復。
所以思路是想辦法移除或重命名其中的一個Pods-dummy.m文件。
發現移除是不可行的,會導致無法生成libPods.a。
**********************嘗試重命名**********************
現在來試重命名。
首先想到的是將xplayer裡的Pods-dummy.m文件重命名,方法如下:
修改xplayer的Podfiles文件
platform :ios, ‘5.0'
target xplayer do
pod 'CocoaHTTPServer', '= 2.3'
pod 'Reachability', '~> 3.0
end
這樣xplayer工程生成的dummy類是PodsDummy_Pods_xplayer。
此時Build xplayerdemo_pods工程會報錯說PodsDummy_Pods_xplayer這個符號重復了: 這是因為xplayerdemo_pods的Pods包含了xplayer, 生成了第二個PodsDummy_Pods_xplayer類。
如果我們能修改target xplayer do裡的”xplayer”為其他字符串就好了,但是目前沒有找到這種解決方案。
現在剩下的辦法是將xplayerdemo_pods裡的Pods-dummy.m文件重命名,方法如下:
修改xplayerdemo_pods的Podfiles文件如下
platform :ios, '5.0'
target :xplayerdemo_pods do #增加target語句
pod 'xplayer', :podspec => 'http://repo.xx.com/specs/xplayer/0.0.1/xplayer.podspec'
end
這樣xplayerdemo_pods工程生成的dummy類是PodsDummy_Pods_xplayerdemo_pods。
這樣就不會和xplayer包含的dummy類PodsDummy_Pods重名了。
問題解決。