ios - Pods 库与第一个目标链接两次,如 libPods.a 和 libPods-<targetname>.a

标签 ios xcode macos cocoapods

我有一个项目,其中包含两个目标,一个用于 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.alibPods-ipolypus.a

如果我尝试立即构建项目,我会收到奇怪的链接错误,例如缺少 FlurrySDK 符号。

要修复它,我必须从库列表中删除 libPods.alibPods-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 installpod 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.alibPods-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/

相关文章:

ios - 在 UIScrollView iOS 的原点上方添加 View

ios - 知道 UITapGestureRecognizer 从 UIView 发送什么标签

ios - XCode 不打开管理器

ios - 找不到选项 '-L/Users/..../TestFlightSDK1.1' 的目录

objective-c - 用于评估字符串的 NSPredicate

ios - UILocalNotification 在整个星期的特定时间触发,除了 1 天

ios - 将图像从网络服务器保存到手机以用于图像 slider

macos - 复制包含空文件的目录树

cocoa - 如何使用 Cocoa 查找已安装卷上的可用空间量?

ios - 将 TableView Controller 更改为 Collection View Controller