dyld: bibliothèque non chargée… Raison: image non trouvée


293

Lorsque j'essaie d'exécuter un exécutable que j'ai reçu sous Mac OS X, j'obtiens l'erreur suivante

dyld: Library not loaded: libboost_atomic.dylib
  Referenced from: /Users/"Directory my executable is in"
  Reason: image not found
Trace/BPT trap:5

J'ai installé les bibliothèques boost et elles se trouvent dans /opt/local/lib. Je pense que le problème a quelque chose à voir avec l'exécutable qui ne regarde que dans le répertoire où il se trouve, car lorsque je colle le 'libboost_atomic.dylib' dedans, cela ne le dérange plus. Malheureusement, il se plaint de ne pas trouver la prochaine bibliothèque de boost.

Existe-t-il un moyen simple de résoudre ce problème?


Si vous avez toujours des problèmes, utilisez la méthode de ce sujet
Tarik

Réponses:


171

Retrouvez toutes les librairies boost:

$ otool -L exefile
exefile:
        @executable_path/libboost_something.dylib (compatibility version 0.7.0, current version 0.7.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 65.1.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

et pour chacun libboost_xxx.dylib, faites:

$ install_name_tool -change @executable_path/libboost_something.dylib /opt/local/lib/libboost_something.dylib exefile

et enfin vérifier à otoolnouveau en utilisant :

$ otool -L exefile
exefile:
        /opt/local/lib/libboost_something.dylib (compatibility version 0.7.0, current version 0.7.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 65.1.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

Pages de manuel: otool install_name_tool

EDIT Il y a quelque temps, j'ai écrit un script python ( copy_dylibs.py) pour résoudre tout cela automatiquement lors de la construction d'une application. Il regroupera toutes les bibliothèques à partir de /usr/localou /opt/localdans le bundle d'application et corrigera les références à ces bibliothèques à utiliser @rpath. Cela signifie que vous pouvez facilement installer une bibliothèque tierce en utilisant Homebrew et les empaqueter tout aussi facilement.

J'ai maintenant rendu ce script public sur github .


4
@trojanfoe pouvez-vous s'il vous plaît expliquer ici quel est le fichier exfile est-ce un chemin d'accès au fichier exec? n'est-ce pas?
VenushkaT

1
Après avoir recompilé l'exécutable, je dois répéter ce processus - assez ennuyeux pendant le développement.
tglas

2
En fait, la meilleure façon est DYLD_LIBRARY_PATHde modifier le chemin de recherche. L'autre réponse a ceci.
frankliuao

18
'exefile': Aucun fichier ou répertoire de ce type
ScottyBlades

2
@ScottyBlades exefilereprésente le fichier exécutable que vous essayez d'exécuter. Dans mon cas, a otool -L /usr/local/bin/phpfait l'affaire.
brunouno

106

Dans l' Generalonglet de la cible , il y a une section appeléeFrameworks, Libraries, and Embedded Content

Cliquez sur le +signe, ajoutez requis frameworket le crash est résolu.

Mettre à jour la dernière capture d'écran de xcode


2
que dois-je ajouter? il y a beaucoup de fichiers
Joe Sleiman

@Himanshu J'ai libcppreset pour mon projet! il a beaucoup de dépendances de boost et ... Je lance un script bash pour les changer avec install_name_tool mais pour le LC_ID_DYLIBje ne peux donc pas avoir besoin de faire un lien symbolique dans usr / loca / opt! existe-t-il un moyen de comprendre? : | C'est douloureux :(
Mo Farhand

85

Cela a fonctionné pour moi:

brew upgrade node

7
Mais qu'est-ce que ça fait?
diegoaguilar

3
@diegoaguilar c'est la réinstallation en nodeutilisant homebrew. Une autre installation a probablement rompu le chemin du nœud. A également fonctionné pour moi.
Hugo Nogueira

69

Après la mise à niveau de Mac OS vers Mojave. J'ai essayé d'installer des modules npm via la yarncommande, j'ai eu une erreur:

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.60.dylib
  Referenced from: /usr/local/bin/node
  Reason: image not found
Abort trap: 6

A été corrigé avec:

brew update
brew upgrade

2
Mon intelliJ a commencé à lancer cette erreur lorsque j'ai récemment mis à jour xcode. J'essayais d'exécuter un serveur node.js via intellij. Je n'étais pas sûr de ce qui n'allait pas. L'exécution node --versionsur mon système a entraîné la même erreur. L'exécution des deux commandes ci-dessus a résolu mon problème.
Ishan

3
Dans mon cas, j'ai également exécuté la brew cleanupcommande, ce qui est parfois utile si vous souhaitez vous débarrasser des anciennes versions.
Michael Behrens

En ce qui concerne le commentaire de @ MichaelBehrens, je lance brew cleanuppuis il corrige.
Buraco

37

Pour certains, cela pourrait être aussi simple que de définir le chemin d'accès système pour les bibliothèques dynamiques. Sous OS X, cela revient à définir la DYLD_LIBRARY_PATHvariable d'environnement. Voir:

Est-il correct d'utiliser DYLD_LIBRARY_PATH sur Mac OS X? Et, quel est l'algorithme de recherche de bibliothèque dynamique avec lui?


Cela peut sembler stupide, mais je me demande quelle valeur dois-je définir DYLD_LIBRARY_PATH?
César

1
@Caesar Placez-le dans le répertoire où se trouvent les dylibs que vous essayez de lier.
markshiz

Vous ne pouvez pas vous attendre à ce que vos utilisateurs changent DYLD_LIBRARY_PATH. La bonne solution consiste à inclure des bibliothèques non standard avec le .appet l'utilisateur n'aura rien à faire. Le développeur, cependant, peut encore avoir à pirater le chemin du chargeur selon ma réponse.
trojanfoe

12

J'ai eu cette erreur lorsque j'ai essayé d'installer ruby ​​2.3.1 à l'aide de rvm. Il m'a d'abord dit de courir brew update, ce que j'ai fait, puis quand j'ai essayé de courir rvm install ruby-2.3.1, j'ai reçu l'erreur dans cette question SO.

Le correctif devait d'abord être exécuté brew upgrade, apparemment selon cette question de superuser.com, vous devez faire les deux brew update&& brew upgrade. Une fois cela fait, j'ai enfin pu installer ruby ​​2.3.1.


Les gens doivent cesser de recommander de faire brew upgradecomme ça. Cela peut être un perturbateur majeur pour l'ensemble de votre système. Au lieu de cela, isolez ce qui doit être mis à niveau et mettez-le à niveau uniquement.
Jivan

7

Vous pouvez utiliser la commande otool avec l'option -L pour l'exécutable, qui affichera où l'exécutable attend ces bibliothèques.

Si le chemin d'accès à ceux-ci doit être modifié, utilisez la commande install_name_tool , qui vous permet de définir le chemin d'accès aux bibliothèques.


7

Maintenant que Xcode a mis à jour leur IDE, ils ont un peu changé la façon dont cela fonctionne.

Auparavant, il était divisé en sections distinctes, comme illustré ci-dessus, avec des fichiers binaires intégrés et des cadres et bibliothèques liés en tant que sections distinctes.

Maintenant, il s'agit d'une section combinée avec des listes déroulantes à droite sur ce qui doit être intégré.

Nouveaux changements IDE

Cela m'a dérouté au début, mais c'est parfaitement logique maintenant.


5

Je suis arrivé ici en essayant d'exécuter un programme que je viens de compiler en utilisant CMake. Lorsque j'essaye de l'exécuter, il se plaint de dire:

dyld: Library not loaded: libboost_system.dylib
  Referenced from: /Users/path/to/my/executable
  Reason: image not found

J'ai contourné le problème en disant à CMake d'utiliser la version statique de Boost, au lieu de le laisser utiliser la version dynamique:

set(Boost_USE_STATIC_LIBS ON)

5

Si vous utilisez Xcode 11 et versions ultérieures:

Allez dans l' Generalonglet et ajoutez le cadre dans la Frameworks, Libraries, and Embedded Contentsection.

Important: Par défaut, il peut être marqué comme Do Not Embed, changez-le Embed Without Signingcomme indiqué sur l'image et vous êtes prêt à partir.

entrez la description de l'image ici

Pour les versions Xcode inférieures à 11:

Ajoutez simplement le cadre dans Embedded Binaries section et vous avez terminé.

À votre santé!


5

Pour résoudre l'erreur ci-dessous sur mon Macbook Catalina 10.15.4:

dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
    Referenced from: /usr/local/bin/mongoexport
    Reason: image not found
Abort trap: 6

J'ai exécuté la commande ci-dessous et contourné le problème ci-dessus:

brew switch openssl 1.0.2s

3

J'ai résolu ce problème en utilisant Product > Clean Build Folder( CommandShiftK), ce qui rend une nouvelle construction propre, vraiment étrange.


2

Vous pouvez utiliser sudo install_name_tool -changechanger le chemin de dylib et sudo install_name_tool -idchanger le nom de dylib



2

Si vous utilisez cmake, ajoutez DYLIB_INSTALL_NAME_BASE "@rpath"aux propriétés cibles:

set_target_properties(target_dyLib PROPERTIES
        # # for FRAMEWORK begin
        # FRAMEWORK TRUE
        # FRAMEWORK_VERSION C
        # MACOSX_FRAMEWORK_IDENTIFIER com.cmake.targetname
        # MACOSX_FRAMEWORK_INFO_PLIST ./Info.plist
        # PUBLIC_HEADER targetname.h
        # # for FRAMEWORK end
        IPHONEOS_DEPLOYMENT_TARGET "8.0"
        DYLIB_INSTALL_NAME_BASE "@rpath" # this is the key point
        XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
        DEVELOPMENT_TEAM "${DEVELOPMENT_TEAM}"
    )

ou dans le projet de bibliothèque dynamique Xcode Target -> Build Setting set Dynamic Library Install Name Base to @rpath


Je crée un projet de bibliothèque dynamique de cadre de cacao, cela fonctionne, et par rapport à mon mauvais projet généré par cmake, trouvez-le différent et corrigé, cela fonctionne sur iOS.
cn00

2

si vous utilisez virtualenv, supprimez simplement le dossier de votre environnement et recréez-le avec cette commande virtualenv --python=/usr/local/bin/python3 the_name_of_my_env


1

Pour tous ceux qui viennent sur cette page parce qu'ils ont eu cette erreur en essayant de lier un framework tiers à leur projet en utilisant Xcode 6.3.1, le problème que j'ai rencontré était parce que la bibliothèque était créée avec une ancienne version du compilateur utilisant une version différente de rapide. La seule façon de résoudre ce problème pour moi était de reconstruire le cadre.

Une autre raison pour laquelle vous pourriez obtenir cela est indiquée dans un document technique Apple.

Si vous créez une application qui n'utilise pas Swift mais intègre un contenu tel qu'un framework qui le fait, Xcode n'inclura pas ces bibliothèques dans votre application. Par conséquent, votre application se bloquera au lancement avec un message d'erreur se présentant comme suit:

définissez le paramètre de génération Embedded Content Contains Swift Code (EMBEDDED_CONTENT_CONTAINS_SWIFT) sur YES dans votre application

Voici le lien vers le document Apple complet qui l'explique ici


1

Pour mon framework, j'utilisais un sous-projet Xcode ajouté comme sous-module git.

Je crois que j'obtenais cette erreur parce que je signais le cadre avec une équipe de signature différente de mon application principale. (changé d'équipe pour l'application; oublié de changer de cadre)

La solution est de ne pas signer dans le cadre du projet. Au lieu de cela, dans la Target > General > Frameworks, Libraries, and Embedded Contentsection de l'application principale , signez le cadre viaEmbed & Sign .

Si je sélectionne Do not Embedou Embed Without Signingj'obtiens plutôt l'erreur:

CADRE non valide pour une utilisation dans le processus utilisant la validation de bibliothèque: le fichier mappé n'a pas de cdhash, complètement non signé? Le code doit être au moins signé de manière ad hoc.


1

Xcode 11.1 et Swift 5.1

Solution rapide

Assurez-vous d'abord que la bibliothèque externe ajoutée a l'option d'intégration est sélectionnée dans l'onglet Général, Binaires intégrés.

Si cela ne fonctionne toujours pas ..

Cela se produit car vous disposez de versions différentes et inégalées des bibliothèques.

Mettre à jour les pods

pod update

Important: vérifiez que toutes les bibliothèques sont incluses dans la liste des paramètres de construction -> bibliothèques et frameworks et que vous avez donné la possibilité de les intégrer dans la construction

Je travaille juste génial


0

Pour tous ceux qui vivent la même chose avec une bibliothèque ou un package différent, @ user3835452 est sur la bonne voie. J'ai trouvé ce message en essayant d'exécuter composer:

dyld: Library not loaded: /usr/local/opt/openldap/lib/libldap-2.4.2.dylib
  Referenced from: /usr/local/opt/php@7.1/bin/php
  Reason: image not found
Abort trap: 6

Après avoir essayé beaucoup de façons différentes, je viens de courir brew install openldapet ça a corrigé. Notez que j'avais déjà couru brew updateet brew upgrademais seulement après avoir installé manuellement openldapcela a fonctionné.


0

J'ai résolu ce problème en réinstallant Homebrew

Désinstaller

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

Installer

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


0

Existe-t-il un moyen simple de résoudre ce problème?

Je viens de l'utiliser brew upgrade <the tool>. Dans mon cas, brew upgrade tmux.


0

J'ai rencontré le problème de plantage de l'application en citant une erreur SIGABRT dans le thread.

Cela a été vu dans Xcode 9.3. La raison pour laquelle j'ai découvert que Xcode ne récupérait pas les bibliothèques de manière dynamique, j'ai donc dû le faire manuellement, ce qui a résolu mon problème de plantage.

Suivez les étapes ci-dessous:

  1. Aller aux phases de construction
  2. Appuyez sur le bouton «+» en haut et sélectionnez «Nouvelle phase de copie du fichier»
  3. Sélectionnez Destination comme Frameworks et appuyez sur le bouton '+' ci-dessous pour ajouter des fichiers.
  4. Sélectionnez Ajouter un autre ci-dessous, cliquez sur CMD + MAJ + G et collez le chemin ci-dessous, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos

Maintenant, vous pourrez voir des dylibs rapides, sélectionnez toutes les bibliothèques swift avec l'extension .dylib et cliquez sur ouvrir.

Ceux-ci seront ajoutés aux fichiers binaires intégrés dans l'onglet général de l'application.

Créez un nouveau groupe dans le dossier du projet et ajoutez toutes ces bibliothèques.

Exécutez maintenant votre application.


0

Si vous utilisez l'environnement Conda dans le terminal, mettez à jour les samtools pour le résoudre.

conda install -c bioconda samtools


0

La meilleure réponse est ci-dessus, vérifiez d'abord quelle est la sortie de

otool -L

Et puis procédez comme suit si incorrect

set_target_properties(
    MyTarget
    PROPERTIES
    XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS
    "@executable_path/Frameworks @loader_path/Frameworks"
)

Et

set_target_properties(
        MyTarget
        PROPERTIES
        XCODE_ATTRIBUTE_DYLIB_INSTALL_NAME_BASE 
        "@rpath"

0

cela devrait résoudre le problème

brew update
brew upgrade
brew cleanup

Veuillez ajouter quelques explications à votre réponse afin que d'autres puissent en tirer des enseignements
Nico Haase Il y a

-1

Rien de ce qui précède n'a fonctionné pour moi, mais l'a brew reinstall icu4cfait.


-1

Pour tous ceux qui pourraient encore avoir ce problème:

C'est un problème permanent du côté d'Apple, et ce qui a fonctionné pour moi, c'est la mise à niveau vers iOS 13.4 (bêta). Installé cela et travaillé comme un charme.


ce n'est pas un problème IOS.
JBarros35
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.