我有一个项目,其中包含两个目标,一个用于 iOS,一个用于 OSX。 这是 Podfile 的样子。
# Pods
xcodeproj 'ipolypus.xcodeproj'
pod 'BlocksKit'
pod 'Reachability'
pod 'MKStoreKit'
# Objective C
pod 'libextobjc'
pod 'LinqToObjectiveC'
target :ipolypus, :exclusive => false do
platform :ios, '5.1.1'
pod 'CocoaLumberjack'
pod 'EGOTableViewPullRefresh'
pod 'SVProgressHUD'
pod 'FlurrySDK'
# AdMob SDK and AdMob mediation adapter
pod 'AdMob'
pod 'AdMobMediationAdapterIAd'
end
target :ipolypusTests, :exclusive => true do
pod 'CocoaLumberjack'
end
target :'ipolypus-osx', :exclusive => false do
platform :osx
pod 'CocoaLumberjack'
end
运行 pod install
后,我可以看到两个 Pod 库链接到第一个目标 (ipolypus
)。
libPods.a
和 libPods-ipolypus.a
如果我尝试立即构建项目,我会收到奇怪的链接错误,例如缺少 FlurrySDK 符号。
要修复它,我必须从库列表中删除 libPods.a
和 libPods-ipolypus.a
以与目标链接,运行 pod再次安装
,然后手动删除第一个目标的libPods.a
,然后它将构建和链接。
我制作 Podfile
的方式一定有问题。我查看了相关帖子,没有发现类似的问题。
更新
这里是链接错误
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_Flurry", referenced from:
objc-class-ref in IOSAppDelegate.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
完成上述步骤后,我将成功构建,直到下一次 pod install
或 pod update
。
我还应该提到,该项目有一段时间只有单一目标,然后我添加了 OSX 目标并为此修改了 Podfile
,这就是问题开始的时候。
但是我尝试删除 Podfile.lock
并删除 Pods
文件夹,问题仍然存在。
我遇到了另一种类型的错误,链接器失败是因为已经定义了相同的符号,但我再也看不到那个了。
最佳答案
我找到了“双重链接”问题的原因。
正如预期的那样,它是由 Podfile
的结构引起的。
因为我想为 OSX 和 iOS 目标提供一些通用的 pod,所以我把它们都放在了开头。
xcodeproj 'ipolypus.xcodeproj'
pod 'BlocksKit'
pod 'Reachability'
pod 'MKStoreKit'
# Objective C
pod 'libextobjc'
pod 'LinqToObjectiveC'
这些普通的pods会在libPods.a
库中,另外,CocoaPods不能忍受一些pods库没有链接到一个目标,所以它会链接libPods。 a
针对默认项目目标,在我的示例中它是 ipolypus
。
然后是为 ipolypus
iOS 目标生成的 libPods-ipolypus.a
。由于此目标不是唯一的,因此 FlurrySDK
之类的内容将同时包含在 libPods.a
和 libPods-ipolypus.a
中,从而导致符号重复链接时。
在尝试找出使用独占/非独占目标配置的正确方法后,我最终得到了每个目标的单独 pod 列表。可能比我想要的要长一点,但会按预期完成工作。
# Pods
xcodeproj 'ipolypus.xcodeproj'
target :ios, :exclusive => true do
platform :ios, '6.0'
link_with 'ipolypus'
# shared
pod 'CocoaLumberjack'
pod 'Reachability'
pod 'MKStoreKit'
pod 'LinqToObjectiveC'
# pod 'EGOTableViewPullRefresh'
# platform
pod 'SVProgressHUD'
pod 'FlurrySDK'
# AdMob SDK and AdMob mediation adapter
pod 'Google-Mobile-Ads-SDK'
pod 'AdMobMediationAdapterIAd'
end
target :iosTests, :exclusive => true do
platform :ios, '6.0'
link_with 'ipolypusTests'
pod 'OCMock'
end
target :osx, :exclusive => false do
platform :osx, '10.7'
link_with 'ipolypus-osx'
# shared
pod 'CocoaLumberjack'
pod 'Reachability'
pod 'LinqToObjectiveC'
end
target :osxTests, :exclusive => true do
platform :osx, '10.7'
link_with 'ipolypus-osxTests'
pod 'OCMock'
end
关于ios - Pods 库与第一个目标链接两次,如 libPods.a 和 libPods-<targetname>.a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697801/