web-dev-qa-db-ja.com

Xcode10-dyld:フレームワークにインストールされたポッドのライブラリがロードされていません

ターゲットフレームワークを使用したプロジェクトがあります。

  • MainAppTarget
  • FrameworkA

FrameworkAは特定のポッドを使用する唯一のものであるため、私のポッドファイルには次のようなものがあります。

target 'MainAppTarget' do
    ...
end

target 'FrameworkA' do
    pod 'PodA'
end

ビルドは問題なく成功しますが、シミュレータでアプリを実行すると、アプリがすぐにクラッシュして次のエラーメッセージが表示されます。

dyld: Library not loaded: @rpath/PodA.framework/PodA
  Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
  Reason: image not found

これまでのところ、何もうまくいかなかった。

これがなぜ起こるのか、そして両方のターゲットにすべてのポッドをインストールする必要なく、どのように機能させることができるのでしょうか?

アプリはSwift 4.2。

14
Giuseppe Lanza

エラーメッセージから、確認する必要のあることがいくつかあります。

_dyld: Library not loaded: @rpath/PodA.framework/PodA
  Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
  Reason: image not found
_

奇妙に思われる最初のことは、ロードされるフレームワーク(FrameworkA.framework)のパスがアプリ内に埋め込まれていないことです。 MainAppTargetの[全般]タブを確認し、フレームワークが[埋め込みバイナリ]および[リンクされたフレームワークとライブラリ]セクションに表示されていることを確認します。

第二に、_@rpath_はrunpath検索パスリストの省略形であり、dyldに必要なライブラリを探す場所を指示します。

ここに、1つのCocoapodを使用するメインアプリと、別のCocoapodを使用するメインアプリが依存する動的フレームワークを使用したGithubのサンプルプロジェクトを示します。 https://github.com/dtweston/FrameworkPodTest

関係するすべてのターゲット(Podsプロジェクトによってビルドされたフレームワークターゲットを含む)で確認する必要があるビルド設定:

  • 実行パス検索パス(_LD_RUNPATH_SEARCH_PATHS_)
    • サンプルプロジェクトでは、これらはココアポッドによって決定されますが、それぞれが$(inherited) @executable_path/Frameworks @loader_path/Frameworksに設定されます
  • 動的ライブラリのインストール名(_LD_DYLIB_INSTALL_NAME_)
    • サンプルプロジェクトでは、これはデフォルトの$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)から変更されていません
  • ダイナミックライブラリインストール名ベース(_DYLIB_INSTALL_NAME_BASE_)
    • サンプルプロジェクトでは、_@rpath_に設定します(これもCocoapodによって決定されます)

以下に、ビルドされたアプリケーションバンドルのスクリーンショットを示します: Finder window

otoolを使用して、xcodebuildによるアプリケーションのアセンブル方法に関する情報を取得できます。

メインのアプリバイナリは次のとおりです。

_otool -L FrameworkPodTest
FrameworkPodTest:
    @rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
    @rpath/Lottie.framework/Lottie (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)
    @rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
    /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 1245.9.2)
...
_

そして、フレームワークのバイナリ:

_otool -L Frameworks/Framework.framework/Framework
Frameworks/Framework.framework/Framework:
    @rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
    @rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
    @rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 1000.11.42)
    @rpath/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 1000.11.42)
...
_
11
Dave Weston

ビルドが成功する理由は、コンパイル中にPodAフレームワークがFrameworkAに見える(リンクできる)ことですが、アプリケーションが起動すると、ダイナミックを見つけてロードしようとするためです。 PodAに必要なフレームワークFrameworkA、およびPodAMainAppTargetに埋め込まれていないように見えるため、アプリが表示されたエラーメッセージでクラッシュします。

これを修正するには、PodAフレームワークがMainAppTargetに埋め込まれていることを確認してください。具体的には、最終的なアプリバンドルのFramewokrsサブフォルダーにPodA.frameworkが含まれていることを確認する必要があります。通常、cocoapodsはフレームワークを自動的にコピーします。

MainAppTargetのビルドフェーズにcocoapodsの[CP] Embed Pods Frameworksが含まれていること、およびスクリプトの入力ファイルにPodAフレームワークへのパスが含まれていることを確認します。このようなもの(例はAlamofireポッドを示しています):

enter image description here

投稿した詳細を使用してプロジェクトを設定しましたが、作成したワークスペースの設定でcocoapodsがこのケースを自動的に処理するように見えます(デモプロジェクトについては、こちらをご覧ください: https:// github。 com/DmitryBespalov/StackOverflowPodFramework )。セットアップが異なる場合は、詳細をお知らせください。さらにサポートさせていただきます。

1
Dmitry Bespalov

At first, check whether your CocoaPod is compatible (supported) or not

FrameworkAをプロジェクトの[全般設定]タブの_Embedded Binaries_セクションにドラッグしたことを確認してください。また、ビルドフェーズタブにEmbed Frameworks (1 item)があり、そこにFrameworkAが含まれていることを確認してください。

解決策は次のとおりです。

ステップ1:プロジェクトナビゲーションで_FrameworkA.framework_をドラッグアンドドロップします。リンクフレームワークとライブラリがこのライブラリを追加しました。

ステップ2:Xcodeで、[プロジェクト]> [全般]> [埋め込みバイナリ]> [_FrameworkA.framework_を追加]に移動します。

ステップ3ビルドフェーズタブLink Binary with Libraries (1 item)およびEmbed Frameworks (1 item)存在します。

enter image description here

enter image description here

追伸私はXcode 10.2.1でそれをしましたが、Xcode 10.1でも同じように動作します。

1
ARGeo

私も同じ問題に直面していました。必要なのは、使用するサードパーティのフレームワークを設定するだけです:-ビルドフェーズセクションのライブラリとバイナリをリンクで必須ではなくオプションとしてPodAそれで全部です。もう一度試してみると、期待どおりに実行されます。

注:-フレームワークを使用しているアプリにPodAを追加する必要があります。 PodAで構成される静的フレームワークを作成し、動的フレームワーク内でこの新しく作成された静的フレームワークを使用する以外の方法はありません。

0
sanyam jain