Bibliothèque OS X Framework non chargée: «Image introuvable»

279

J'essaie de créer un cadre OS X de base, en ce moment je viens de créer un cadre de test: TestMacFramework.frameworket j'essaie de l'importer dans un tout nouveau projet d'application OS X.

J'ai construit le fichier .framework et l'ai importé dans le nouveau projet, le cadre semble bien se lier, et je peux référencer le fichier d'en-tête public que j'ai ajouté à la section des phases de construction du cadre.

Cependant, lorsque j'essaie d'exécuter l'application conteneur, j'obtiens l'erreur suivante:

dyld: Library not loaded: /Library/Frameworks/TestMacFramework.framework/Versions/A/TestMacFramework
  Referenced from: /Users/samharman/Library/Developer/Xcode/DerivedData/TestMacContainer-dzabuelobzfknafuhmgooqhqrgzl/Build/Products/Debug/TestMacContainer.app/Contents/MacOS/TestMacContainer
  Reason: image not found

Après un peu de recherche sur Google, j'ai réalisé que je devais ajouter une Copy Filessection à mes phases de construction d'application de conteneur, donc je l'ai fait et configuré comme ça ...

entrez la description de l'image ici

Cependant, je reçois toujours l'erreur d'exécution. Je fais évidemment quelque chose de mal ici, mais la ressource de la bibliothèque de développeurs Apple pour cette référence Xcode 2, n'est donc pas très utile!

Qu'est-ce que j'ai raté?

METTRE À JOUR:

Je peux voir dans le journal de construction que mon TestMacFramework.frameworkest copié dans le répertoire .app contents / frameworks, mais il n'est pas installé dans le répertoire Library / Frameworks sur le disque dur

entrez la description de l'image ici

MISE À JOUR 2:

La construction se lie correctement si je copie manuellement le TestMacFramework.frameworkdans le Library/Frameworksrépertoire

Sammio2
la source
1
Qu'est-ce qui otool -Lvous indique où l'application s'attend à trouver le framework?
trojanfoe
D'accord, j'ai compris comment l'exécuter ... C'est la sortie que j'obtiens pour ma bibliothèque (j'ai exclu les autres dépendances, comme Foundation, etc.)/Library/Frameworks/TestMacFramework.framework/Versions/A/TestMacFramework (compatibility version 1.0.0, current version 1.0.0)
Sammio2
Mon correctif consistait à intégrer sous forme de fichiers binaires la bibliothèque dont j'avais besoin (Alamofire). Est-ce acceptable?
Cmag
2
Il est très déroutant que cette question soit clairement identifiée comme étant pour OS X, et toutes les réponses, y compris celle acceptée, sont pour iOS. J'ai la même erreur et je ne peux utiliser aucune des réponses.
RenniePet
@RenniePet Depuis Xcode 7.3, le processus est le même pour les frameworks iOS et macOS, la réponse acceptée est la bonne façon de le faire. Si vous rencontrez toujours des problèmes, il pourrait s'agir d'un problème sans rapport?
Sammio2

Réponses:

553

[Xcode 11+]

La seule chose à faire est d'ajouter le framework à la General->Frameworks, Libraries And Embedded Contentsection dans l' Generalonglet de la cible de votre application.

Assurez-vous de sélectionner l'option «Intégrer et signer».

entrez la description de l'image ici

[Xcode v6 -> Xcode v10]

La seule chose à faire est d'ajouter le framework à la Embedded binariessection dans l' Generalonglet de la cible de votre application.

Capture d'écran de Xcode

Kappe
la source
32
C'est la seule étape nécessaire pour iOS.
nikolovski
7
Merci! Résolu pour moi sur iOS.
user1244109
6
Je vous remercie! Cela m'a aidé pour iOS
Alexander Khitev
4
J'utilise une classe de mon framework importé dans Storyboard et je rencontrais cette erreur. Je voulais juste ajouter que, en plus de définir la CLASSE personnalisée dans Storyboard, vous devez également définir le champ MODULE.
Ruben Martinez Jr.,
8
@ZevsVU Je n'ai pas de Embedded binariessection dans mon projet macOS. Qu'est-ce qui ne va pas?
fnc12
56

J'ai donc réussi à le faire fonctionner, c'est assez simple quand on a les bonnes instructions. Ce que je cherchais, c'était un cadre «privé» qui réside dans le bundle d'application plutôt que d'être écrit dans le dossier de la bibliothèque système.

Construire le cadre

  1. Ajouter une cible pour créer un framework Cocoa
  2. Dans ces cibles, les «Paramètres de construction» configurent le «Répertoire d'installation» en «@executable_path /../ Frameworks»
  3. Créez une bibliothèque et accédez au .framework à partir de l'archive ou du répertoire des produits

Y compris le cadre

  1. Faites glisser le fichier .framework créé dans le projet Xcode, assurez-vous de cocher «Copier les fichiers dans le répertoire»
  2. Dans la cible des applications contenant, ajoutez une nouvelle «phase de création de fichier de copie»
  3. Définissez la «Destination» sur «Frameworks»
  4. Faites glisser le .framework créé
Sammio2
la source
1
Cela fonctionne également pour les frameworks iOS. Lors de l'ajout du cadre personnalisé dans l'espace de travail pour construire avec lui. Vous devez ajouter la partie Including The Framework de cette solution pour résoudre cette erreur lors du débogage sur l'appareil!
cynistersix
1
Merci, j'ai travaillé pour iOS. Je n'ai pas suivi vos premières étapes car les frameworks étaient déjà construits dans mon dossier de données dérivées
Gmeister4
Impressionnant! J'ai sauvé ma folle journée! 2017 - Xcode 8.3.2 Merci!
Glenn
Pour une raison étrange, vous ne pouvez pas faire glisser le cadre de la section par défaut "Lier le binaire avec les bibliothèques" à la section "Cadres intégrés", mais vous pouvez faire glisser le cadre depuis la liste Projets à gauche. Vous devrez toujours supprimer manuellement le framework de la section "Link Binary With Libraries" avec le bouton "-".
William Cerniuk
18

C'était assez simple pour moi, je viens d'ajouter mon framework à mes binaires intégrés sous les cibles de l'application

Robin Delaporte
la source
15

Les options ci-dessus n'étaient pas possibles pour moi à inclure. Je l'ai résolu en spécifiant le chemin de recherche Runpath

C'est dans l' onglet ' Build Settings '. Dans la section « Liaison ». Changez ' Runpath Search Paths ' en$(inherited) @executable_path/Frameworks

Vincent
la source
J'avais besoin des deux étapes, cette étape et d'ajouter une nouvelle «phase de création de fichier de copie» avec le cadre avant.
user23
J'avais un ancien projet Xcode qui a été mis à jour progressivement et ces paramètres manquaient pour moi. Ajouté et fonctionne maintenant comme prévu.
Mattio
parmi toutes ces solutions, celle-ci a fonctionné, il est tellement ennuyeux de voir comment l'approche du problème est comme "ok, laissez-moi descendre la liste de tous ces messages de stackoverflow, car la cause racine n'est pas claire" APPLEEEEE
Ryan
9

J'ai rencontré le même problème mais la solution acceptée n'a pas fonctionné pour moi. Au lieu de cela, la solution consistait à modifier le nom d'installation du framework.

L'erreur dans le message d'origine est:

dyld: Library not loaded: /Library/Frameworks/TestMacFramework.framework/Versions/A/TestMacFramework
  Referenced from: /Users/samharman/Library/Developer/Xcode/DerivedData/TestMacContainer-dzabuelobzfknafuhmgooqhqrgzl/Build/Products/Debug/TestMacContainer.app/Contents/MacOS/TestMacContainer
  Reason: image not found

Notez le premier chemin après la bibliothèque non chargée . Le cadre est chargé à partir d'un chemin absolu. Ce chemin provient du nom d'installation du framework (parfois appelé rpath), qui peut être examiné en utilisant:

otool -D MyFramework.framework/MyFramework

Lorsqu'un framework est intégré dans une application, ce chemin doit être relatif et de cette forme: @ rpath / MyFramework.framework / MyFramework . Si le nom d'installation de votre framework est un chemin absolu, il peut ne pas être chargé au moment de l'exécution et une erreur similaire à celle ci-dessus sera produite.

La solution consiste à modifier le nom de l'installation:

install_name_tool -id "@rpath/MyFramework.framework/MyFramework" MyFramework.framework/MyFramework 

Avec ce changement, je ne reçois plus l'erreur

Amos Joshua
la source
8

La suppression des données dérivées les a enregistrées pour moi

SleepsOnNewspapers
la source
3
Ça n'a pas marché pour moi, cependant quand j'ai fait pod installça a marché.
Hola Soy Edu Feliz Navidad
7

Aucun de ces problèmes n'a résolu cela pour moi. Le problème à la fin était assez facile. Il semble que ce soit un bug Xcode assez important que j'ai enregistré le problème et corrigé sous le bug Apple: 29820370. Si vous rencontrez des difficultés (car il semble qu'il y ait plusieurs pages de problèmes similaires à celui-ci), ce serait bien si vous le pouviez déclencher un bug sur le reporter de bug: https://bugreport.apple.com/ et référencer le bug que j'ai soulevé pour gagner en visibilité. Je veux faire de Xcode le plaisir qu'il était auparavant - et c'est quelque chose que je suis sûr que Xcode aurait dû se réparer.

Voici le correctif: 1. Ouvrez le trousseau - accédez à Apple Worldwide Developer Cert. 2. Double-cliquez dessus 3. Modifiez le niveau d'autorisation de «toujours faire confiance» pour utiliser les valeurs par défaut du système 4. Enregistrez et fermez-le 5. Redémarrez Xcode, nettoyez et générez votre projet et il devrait être parti.

Capture d'écran ci-dessous des paramètres corrects: Accès au trousseau corrigé j'espère que cela vous aidera!

UKDataGeek
la source
2
"Utiliser les valeurs par défaut des systèmes" semble être le paramètre standard.
Raphael
Pas toujours - quelque chose semble le changer, ce qui entraîne cette erreur
UKDataGeek
Merci, cela a également résolu mon problème! Malheureusement, je ne vois pas votre ticket sur le traqueur de bogues pour lui donner une visibilité supplémentaire. Je ne sais pas pourquoi, cela ne montre cependant aucun bogue.
Jim
7

Xcode 11:

dans Xcode 11 ajouter un cadre dans General->Frameworks, Libraries And Embedded Content

après l'ajout, assurez-vous de sélectionner l' Embed & Signoption

entrez la description de l'image ici

Saifan Nadaf
la source
2
si vous faites cela, vous ne pourrez pas télécharger votre application sur l'App Store
Mahendra
@Mahendra, quelle est l'alternative que vous utilisez dans ce cas? J'ai eu un problème similaire.
Derryl Thomas
@DerrylThomas, L'application est toujours en mode développement, donc je n'ai pas testé ce cas
Mahendra
1
@Mahendra, veuillez partager ici au cas où vous trouveriez une alternative à cela. Je vous en serais très reconnaissant.
Derryl Thomas
@DerrylThomas Lors de la création d'une archive, restaurez-la, option Ne pas incorporer et créez un exécutable à télécharger sur l'App Store.
BlackPearl12
6

Lorsque vous faites glisser un framework personnalisé dans un projet sous Xcode 10.1 , il suppose que le framework est un framework système et place le framework dans la section "Link Binary With Libraries" de "Build Phases" sous votre cible.

Les frameworks système sont déjà sur le périphérique, il n'est donc pas copié sur le périphérique et ne peut donc pas s'exécuter au moment de l'exécution, donc KABOOM (crash dans __abort_with_payload, et erreur de désinformation: "Raison: image introuvable"). En effet, le code cadre n'est pas copié sur l'appareil ...

En réalité, pour que Xcode relie à la fois le cadre personnalisé et s'assure qu'il est copié avec votre code sur l'appareil iOS (réel ou simulateur), le cadre personnalisé doit être déplacé vers "Copy Bundle Resources". En fin de compte, cela conditionne le cadre avec votre exécutable de code pour être disponible sur l'appareil ensemble.

Pour ajouter un cadre personnalisé à un projet et éviter le plantage d'Apple:

  1. Faites glisser le cadre personnalisé dans votre liste de fichiers de projet iOS
  2. Cliquez sur ProjectName dans Navigator -> TargetName -> "Build Phases" -> Link Binary With Libraries triangle de divulgation
  3. Faites glisser le cadre personnalisé vers l'extérieur et le bas dans la section "Copier les ressources de l'ensemble" ci-dessous (Xcode déplace maintenant la référence du cadre, corrigée dans Xcode 10)
  4. Exécuter dans un simulateur ou un appareil

Le cadre personnalisé est ainsi copié avec votre code sur votre appareil cible et est disponible au moment de l'exécution.

entrez la description de l'image ici

[éditorial: vous penseriez que Xcode serait assez intelligent pour comprendre la différence entre l'un de ses cadres système qui n'ont pas besoin d'être copiés sur l'appareil et un cadre personnalisé qui est, oh je ne sais pas, dans la hiérarchie du répertoire racine du projet ... 🙄]

William Cerniuk
la source
5

Il devrait y avoir un 'Run Script' dans 'Build Phases' avec ceci: '/ usr / local / bin / carthage copy-frameworks'

Sur les «fichiers d'entrée» de ce «script d'exécution», vous devez ajouter le chemin d'accès à vos bibliothèques. Comme ça:

Build Phases Run Script

thacilima
la source
4

Si vous réinitialisez accidentellement votre trousseau, cela peut se produire en raison de certificats Apple manquants dans le trousseau. J'ai suivi cela pour résoudre mon problème.

J'ai eu le même problème et j'ai pu le résoudre en téléchargeant à nouveau le WWDR (Apple Worldwide Developer Relations Certification Authority). Téléchargez ici: http://developer.apple.com/certificationauthority/AppleWWDRCA.cer

user1742302
la source
Cela a également résolu mon problème. N'oubliez pas de nettoyer le dossier de génération avant de recompiler.
Justin Milo
4

Si vous utilisez Xcode 11 , assurez-vous que le cadre a été ajouté dans Frameworks, Libraries et Embed Content sous Target settings - General. Changer le statut d'intégration de - 'Ne pas intégrer' à 'Intégrer et signer'

Sachin Nautiyal
la source
Mais cela donnera une erreur de support Swift ITMS-90206 non valide lorsque vous distribuerez sur l'App Store. Cela ne fonctionne que dans le développement.
Raptor
2

Que résolu pour moi changeait abstract_targetà targetla cible principale dans mon PODFILE. Je l'avais précédemment réglé sur abstract_targetet cela a provoqué l'erreur décrite. Maintenant ça marche comme un charme

Francesco DM
la source
1

Pour Xcode 8, certains produits périmés seront supprimés du dossier de données dérivées. Reportez-vous à cette solution .

Apple: dans macOS 10.12 et versions ultérieures, Xcode nettoie les données dérivées périmées, les en-têtes précompilés et les caches de module. (23282174)

Le système de génération Xcode prend en charge la suppression des fichiers périmés de certains types d'artefacts de génération qui ont été produits dans une génération précédente, mais qui ont depuis été supprimés du projet.

Sur la base de la pensée de l'auteur, j'ai trouvé ce journal de construction de mon cas.

Remove stale build products

/bin/rm -rf /Users/usename/Library/Developer/Xcode/DerivedData/myapp-esvvhwwwwngijeemhatmklwzoxnb/Build/Products/Debug-iphonesimulator/myapp.app/Frameworks/AliyunVodPlayerSDK.framework
/bin/rmdir /Users/usename/Library/Developer/Xcode/DerivedData/myapp-esvvhwwwwngijeemhatmklwzoxnb/Build/Products/Debug-iphonesimulator/myapp.app/Frameworks

Après avoir créé une nouvelle phase de copie de fichier et copié le cadre périmé cible vers la destination Frameworks , le journal de suppression ci-dessus disparaît après la reconstruction.

Clarifiez simplement ma situation et ma raison, j'espère que cela sera utile à quelqu'un.

Itachi
la source
1

Pour moi, c'était la solution, après de nombreuses heures de recherche !!

Pour une raison quelconque, bien dans le développement d'un cadre personnalisé Swift 2.3, Xcode 8 avait supprimé le DYLIB_INSTALL_NAME_BASEparamètre du project.pbxprojfichier. Une petite promenade dans le Build Settings / Dynamic Library Install Name Basedécor@rpath réparer.

(depuis https://forums.developer.apple.com/thread/4687 )

encapsule
la source
0

J'ai trouvé que ce problème n'était lié qu'à la signature de code et aux certificats et non au code lui-même. Pour vérifier cela, créez l'application de vue unique de base et essayez de l'exécuter sans aucune modification de votre appareil. Si vous voyez le même type d'erreur, cela indique que votre code est correct. Comme moi, vous constaterez que vos certificats sont invalides. Téléchargez-les à nouveau et corrigez ceux qui ont expiré. Ensuite, lorsque vous obtenez l'application de base pour ne pas signaler l'erreur, essayez à nouveau votre application après avoir quitté Xcode et peut-être redémarré votre Mac pour faire bonne mesure. Cela a finalement mis fin à ce cauchemar. Cela n'a probablement rien à voir avec votre code, surtout si vous obtenez un message Build Successful lorsque vous essayez de l'exécuter. FYI

iOS4Fun
la source
0

Vous avez rencontré le problème lorsque vous essayez la version bêta de Xcode 9 et que vous revenez à Xcode 8. Un simple nettoyage sur la cible a résolu le problème.

Xavier
la source
0

J'ai eu le même problème pour une raison différente. J'ai créé une nouvelle configuration pour Debug and Release (sous PROJECT -> onglet Info -> Configuration). Et j'ai dû changer mon script shell de frameworks pod (Pods- "appName" -frameworks.sh, sous Targets Support Files) pour le faire fonctionner.

[Xcode 9]

Yuval
la source
0

La seule chose qui a fonctionné pour moi:

Cible> Phases de construction> [CP] Cadres d'intégration des pods Décochez "Afficher les variables d'environnement dans le journal de génération" et "Exécuter le script uniquement lors de l'installation"

Neil
la source
0

J'ai essayé de nombreuses corrections, mais ce qui a fonctionné pour moi a été de supprimer une cible manquante répertoriée dans l'onglet de construction du schéma de construction. Vous pouvez y accéder en ouvrant la fenêtre d'édition du schéma actuel.

Edit: Ma cible de test d'interface utilisateur ne fonctionnait pas aussi bien, et la solution que j'ai trouvée était de la supprimer et de la générer à nouveau.

Gonzalo
la source
0

open xcode -> general -> Embedded Binaries -> add QBImagepicker.framework and RSKImageCropper -> clean project

il suffit d'ajouter QBImagePicker.framework et RSKImageCropper.framework aux binaires intégrés qui ont fonctionné pour moi

Agustiar
la source
0

Je pense qu'il n'y a pas de moyen fixe de résoudre ce problème car il pourrait être causé par une raison différente. J'ai également eu ce problème la semaine dernière, je ne sais pas quand et exactement quelle est la cause de ce problème, uniquement lorsque je l'exécute sur un simulateur avec Xcode ou essaie de l'installer sur le téléphone, puis il signale ce type d'erreur, mais quand je exécutez-le avec run-ios native avec react, il n'y a pas de problème.

J'ai vérifié toutes les façons publiées sur Internet, comme renouveler le certificat, modifier les paramètres dans Xcode (toutes les façons mentionnées ci-dessus), en fait, tous les paramètres dans Xcode ont déjà été définis comme il l'avait demandé auparavant, aucune des méthodes ne fonctionne pour moi. Jusqu'à ce matin, quand je supprime les pods et les réinstalle, l'erreur va finalement se produire après une semaine. Si vous utilisez également du cocoapod et que l'erreur vient de se présenter sans aucune raison spécifique, vous pouvez peut-être essayer à ma façon.

  1. Vérifiez ma version des cocoapods.
  2. Mettez-le à jour si une nouvelle version est disponible.
  3. Allez dans votre dossier de projet, supprimez votre Podfile.lock, fichier Pods, projet xcworkspace.
  4. Exécutez l'installation du pod
Jack
la source
0

J'ai rencontré ce problème uniquement lors de l'exécution sur un appareil réel (iPhone SE). Le projet sur simulateur a fonctionné comme prévu.

J'ai essayé toutes les corrections de ce fil même et d' ici . Aucun de ceux-là ne travaillait pour moi.

Pour moi, le problème a été résolu après le redémarrage de l'iPhone (sic!).

J'ai fait:

  • dossier de construction propre,
  • nettoyer les données dérivées,
  • supprimer l'application de l'appareil,
  • redémarrer l'appareil

Et ça marche enfin. :)

Si toutes les autres solutions échouent, n'oubliez pas de l'essayer.

vandermesis
la source
0

Xcode 11: phases de construction -> Intégrer des cadres

entrez la description de l'image ici

Ofir Malachi
la source