web-dev-qa-db-fra.com

Xcode10 - dyld: bibliothèque non chargée pour le pod installé dans le framework

J'ai un projet avec des frameworks cibles.

  • MainAppTarget
  • FrameworkA

FrameworkA est le seul à utiliser un certain pod, donc dans mon fichier pod j'ai quelque chose comme

target 'MainAppTarget' do
    ...
end

target 'FrameworkA' do
    pod 'PodA'
end

la génération réussit sans problème, mais lorsque j'exécute l'application sur un simulateur, l'application se bloque immédiatement avec le message d'erreur suivant:

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

J'ai essayé tous les suspects habituels (supprimer les données dérivées, nettoyer, désintégrer le pod ...) rien n'a fonctionné jusqu'à présent.

Une idée pourquoi cela se produirait et comment je peux le faire fonctionner sans avoir à installer tous les pods nécessairement sur les deux cibles?

L'application est en Swift 4.2.

14
Giuseppe Lanza

D'après votre message d'erreur, il y a quelques points à vérifier.

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

La première chose qui semble étrange est que le chemin du framework en cours de chargement (FrameworkA.framework) n'est pas intégré dans une application. Vérifiez l'onglet "Général" du MainAppTarget et assurez-vous que le cadre apparaît dans les sections "Binaires intégrés" et "Cadres et bibliothèques liés".

Deuxièmement, @rpath Est un raccourci pour la liste des chemins de recherche runpath, qui indique à dyld où chercher les bibliothèques nécessaires.

Voici un exemple de projet sur Github avec une application principale qui utilise un Cocoapod, et un cadre dynamique dont dépend l'application principale qui utilise un Cocoapod différent: https://github.com/dtweston/FrameworkPodTest

Créez des paramètres que vous devez vérifier sur toutes les cibles impliquées (y compris les cibles de framework construites par le projet Pods):

  • Runpath Search Paths (LD_RUNPATH_SEARCH_PATHS)
    • Dans l'exemple de projet, ceux-ci sont déterminés par le cocoapod, mais chacun est défini sur $(inherited) @executable_path/Frameworks @loader_path/Frameworks
  • Nom d'installation de la bibliothèque dynamique (LD_DYLIB_INSTALL_NAME)
    • Dans l'exemple de projet, cela est inchangé par rapport à la valeur par défaut $(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)
  • Base de noms d'installation de bibliothèque dynamique (DYLIB_INSTALL_NAME_BASE)
    • Dans l'exemple de projet, définissez sur @rpath (À nouveau déterminé par le Cocoapod)

Voici une capture d'écran de l'ensemble d'applications intégré montrant comment il est présenté: Finder window

Vous pouvez utiliser otool pour obtenir des informations sur la façon dont l'application est assemblée par xcodebuild.

Voici le binaire de l'application principale:

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)
...

Et le cadre binaire:

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

La raison pour laquelle la construction réussit est que le framework PodA est visible par le FrameworkA pendant la compilation (il peut y créer un lien), mais lorsque l'application se lance, elle essaie de trouver et de charger la dynamique framework PodA requis par le FrameworkA, et il semble que le PodA ne soit pas intégré dans le MainAppTarget, donc l'application se bloque avec le message d'erreur que vous avez vu .

Pour résoudre ce problème, assurez-vous que le cadre PodA est intégré dans le MainAppTarget. Plus précisément, vous devez vous assurer que le dernier ensemble d'applications contient le PodA.framework Dans le sous-dossier Framewokrs. Cocoapods copie généralement les frameworks automatiquement.

Vérifiez que les phases de construction du MainAppTarget contiennent le [CP] Embed Pods Frameworks Des cocoapods et que les fichiers d'entrée des scripts contiennent le chemin d'accès au framework PodA. Quelque chose comme ça (l'exemple montre le pod Alamofire):

enter image description here

J'ai mis en place un projet avec les détails que vous avez publiés, mais il me semble que cocoapods gère ce cas automatiquement dans la configuration de l'espace de travail créé (vous pouvez jeter un œil à mon projet de démonstration ici: https: // github. com/DmitryBespalov/StackOverflowPodFramework ). Si votre configuration est différente, veuillez me faire part des détails et je pourrai vous aider davantage.

1
Dmitry Bespalov

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

Assurez-vous d'avoir fait glisser FrameworkA vers la section Embedded Binaries Dans l'onglet Paramètres généraux de votre projet. Assurez-vous également que vous disposez de Embed Frameworks (1 item) dans Phases de construction onglet et FrameworkA y est inclus.

Voici une solution:

Première étape : faites glisser et déposez FrameworkA.framework Dans la navigation de votre projet. Le framework Link et la bibliothèque ont ajouté cette bibliothèque.

Deuxième étape : Dans Xcode, allez dans Projet> Général> Binaire incorporé> Ajouter FrameworkA.framework.

Troisième étape : assurez-vous que dans Build Phases les onglets Link Binary with Libraries (1 item) et Embed Frameworks (1 item) existent.

enter image description here

enter image description here

P.S. Je l'ai fait dans Xcode 10.2.1 mais dans Xcode 10.1, cela fonctionne de la même manière.

1
ARGeo

Moi aussi, je faisais face au même problème. Tout ce que vous devez faire est de définir les cadres tiers que vous utilisez, par exemple: - PodA comme facultatif au lieu de requis sous Lien binaire avec les bibliothèques dans la section Phases de construction. C'est tout. réessayez et il fonctionnera comme prévu.

Remarque: - Vous devez ajouter le PodA dans l'application dans laquelle vous utilisez votre framework. Il n'y a pas d'autre moyen que de créer un cadre statique composé de votre PodA et d'utiliser ce nouveau cadre statique créé dans votre cadre dynamique.

0
sanyam jain