1

iOS用とOSX用の2つのターゲットを含むプロジェクトがあります。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、2 つの Pods ライブラリが最初のターゲット ( ipolypus) に対してリンクされていることがわかります。

libPods.alibPods-ipolypus.a

プロジェクトをすぐにビルドしようとすると、FlurrySDK シンボルが見つからないなどの奇妙なリンク エラーが発生します。

それを修正するには、ライブラリのリストから削除して、ターゲットとリンクし、再度実行libPods.aしてから、最初のターゲットを手動で削除してから、ビルドしてリンクする必要があります。libPods-ipolypus.apod installlibPods.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

また、同じシンボルが既に定義されているためにリンカーが失敗した別のタイプのエラーがありましたが、もうそのシンボルは表示されません。

4

1 に答える 1

2

I got to the cause of "double-linking" problem. It's caused by the structure of the Podfile, as expected. Since I wanted to have some common pods available both for OSX and iOS targets, I put them all in the beginning.

xcodeproj 'ipolypus.xcodeproj'

pod 'BlocksKit'
pod 'Reachability'
pod 'MKStoreKit'

# Objective C
pod 'libextobjc'
pod 'LinqToObjectiveC'

These common pods will be in libPods.a library, also, CocoaPods can't stand the fact that some pods library is not linked against a target, so it will link libPods.a against default project target, in my example it's ipolypus.

Then there's libPods-ipolypus.a generated for ipolypus iOS target. Since this target is not exclusive, things like FlurrySDK will be included into both libPods.a and libPods-ipolypus.a, resulting into duplicated symbols while linking.

After trying to figure out the proper way to use exclusive/non-exclusive target configs, I ended up with separate list of pods for each target. Might be a bit longer than I would want, but does the job as expected.

# 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
于 2014-01-28T23:04:28.140 に答える