dyld: библиотека не загружена ... Причина: изображение не найдено


295

При попытке запустить исполняемый файл, который мне отправили в Mac OS X, я получаю следующую ошибку

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

Я установил библиотеки наддува, и они находятся в /opt/local/lib. Я думаю, что проблема как-то связана с тем, что исполняемый файл выглядит только в каталоге, в котором он находится, например, когда я вставляю туда libboost_atomic.dylib, он больше не возражает против этого. К сожалению, тогда он жалуется, что не может найти следующую библиотеку наддува.

Есть ли простой способ это исправить?


Если у вас все еще есть проблема, используйте метод из этой темы
Тарик

Ответы:


172

Найти все библиотеки поддержки:

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

и для каждого libboost_xxx.dylib:

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

и, наконец, проверьте еще otoolраз:

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

: страницы руководства otool install_name_tool

РЕДАКТИРОВАТЬ Некоторое время назад я написал скрипт Python ( copy_dylibs.py) для автоматической обработки всего этого при создании приложения. Он упакует все библиотеки из /usr/localили /opt/localв комплект приложения и исправит ссылки на эти библиотеки для использования @rpath. Это означает, что вы можете легко установить стороннюю библиотеку с помощью Homebrew и упаковать их так же легко.

Теперь я опубликовал этот скрипт на github .


4
@trojanfoe, не могли бы вы объяснить, что это за файл? Это путь к файлу exec инструмента? не так ли?
VenushkaT

1
После перекомпиляции исполняемого файла я должен повторить этот процесс - довольно раздражающий во время разработки.
tglas

2
На самом деле лучший способ - это использовать DYLD_LIBRARY_PATHдля изменения пути поиска. Другой ответ получил это.
frankliuao

18
'exefile': Нет такого файла или каталога
ScottyBlades

2
@ScottyBlades exefileобозначает исполняемый файл, который вы пытаетесь запустить. В моем случае otool -L /usr/local/bin/phpсделали свое дело .
Brunouno

106

На Generalвкладке цели есть раздел под названиемFrameworks, Libraries, and Embedded Content

Нажмите на +знак, добавьте необходимое, frameworkи сбой будет решен.

Обновите последний снимок экрана xcode


2
что я должен добавить? там много файлов
Джо Слейман

@Himanshu У меня есть libcppreset для моего проекта! он сильно зависит от boost и ... я запускаю скрипт bash, чтобы изменить их с помощью install_name_tool, но для этого LC_ID_DYLIBмне не нужно делать символическую ссылку в usr / loca / opt! есть ли способ выяснить? : | Это больно :(
Мо Фарханд

85

Это сработало для меня:

brew upgrade node

7
Что это делает, хотя?
diegoaguilar

3
@diegoaguilar это переустановка nodeс помощью homebrew. Вероятно, другая установка сломала путь к узлу. Также работал для меня.
Уго Ногейра

69

После обновления Mac OS до Мохаве. Я попытался установить модули npm через yarnкоманду, я получил ошибку:

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

Исправлено с помощью:

brew update
brew upgrade

2
Мой intelliJ начал выдавать эту ошибку, когда я недавно обновил xcode. Я пытался запустить сервер node.js через intellij. Я не был уверен, что пошло не так. Запуск node --versionв моей системе привел к той же ошибке. Выполнение двух вышеуказанных команд решило мою проблему.
Ишан

3
В моем случае я также выполнил brew cleanupкоманду, что иногда полезно, если вы хотите избавиться от старых версий.
Майкл Беренс

Что касается комментария @ MichaelBehrens, я бегу brew cleanup то это исправлено
Бурако

37

Для некоторых это может быть так же просто, как установка системного пути для динамических библиотек. На OS X это так же просто, как установка DYLD_LIBRARY_PATHпеременной среды. Видеть:

Можно ли использовать DYLD_LIBRARY_PATH в Mac OS X? И что за алгоритм динамического поиска в библиотеке?


Это может показаться глупым, но мне интересно, какое значение я должен установить DYLD_LIBRARY_PATH?
Цезарь

1
@Caesar Установите его в каталог, где находятся дилибы, с которыми вы пытаетесь связать.
отмечается

Вы не можете ожидать, что ваши пользователи изменятся DYLD_LIBRARY_PATH. Правильное решение состоит в том, чтобы включить нестандартные библиотеки, .appи пользователю не нужно ничего делать. Разработчику, однако, возможно, все равно придется взломать путь загрузчика согласно моему ответу.
Trojanfoe

12

Я получил эту ошибку, когда попытался установить ruby ​​2.3.1 с помощью rvm. Сначала он сказал мне бежать brew update, что я и сделал, а затем, когда я попытался бежатьrvm install ruby-2.3.1 , я получил ошибку в этом вопросе SO.

Исправление состояло в том, чтобы сначала запустить brew upgrade, по-видимому, в соответствии с этим вопросом superuser.com, вы должны сделать оба brew update&& brew upgrade. Как только это будет сделано, я смог наконец установить ruby ​​2.3.1.


Люди должны перестать рекомендовать делать brew upgradeименно так. Это может стать серьезным нарушителем для всей системы. Вместо этого выделите то, что нужно обновить, и обновите только это.
Дживан

7

Вы можете использовать otool с опцией -L для исполняемого файла, который покажет, где исполняемый файл ожидает, что эти библиотеки будут.

Если путь к ним нужно изменить, используйте команду install_name_tool , которая позволяет вам указать путь к библиотекам.


7

Теперь, когда Xcode обновил свою IDE, они немного изменили то, как это работает.

Раньше его делили на отдельные секции, как показано выше, с «Встроенными двоичными файлами» и «Связанными фреймворками и библиотеками» в качестве отдельных секций.

Теперь это один комбинированный раздел с выпадающими меню справа о том, что должно быть встроено.

Новые изменения в IDE

Сначала это смущало меня, но теперь имеет смысл.


5

Я попал сюда, пытаясь запустить программу, которую я только что скомпилировал, используя CMake. Когда я пытаюсь запустить его, он жалуется, говоря:

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

Я обошел проблему, сказав CMake использовать статическую версию Boost вместо того, чтобы позволить ей использовать динамическую:

set(Boost_USE_STATIC_LIBS ON)

5

Если вы используете Xcode 11 и выше:

Перейдите на Generalвкладку и добавьте фреймворк в Frameworks, Libraries, and Embedded Contentраздел.

Важное замечание: по умолчанию оно может быть помечено как Do Not Embed, измените его так, Embed Without Signingкак показано на рисунке, и все готово.

введите описание изображения здесь

Для версий Xcode ниже 11:

Просто добавьте фреймворк в Embedded Binariesраздел и все готово.

Ура!


5

Чтобы устранить ошибку ниже на моем 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

Я выполнил команду ниже и обошел проблему выше:

brew switch openssl 1.0.2s

3

Я исправил эту проблему с помощью Product > Clean Build Folder( CommandShiftK), что делает новую чистую сборку действительно странной.


2

Вы можете использовать sudo install_name_tool -changeизменить путь dylib и sudo install_name_tool -idизменить имя dylib



2

Если вы используете cmake, добавьте DYLIB_INSTALL_NAME_BASE "@rpath"в целевые свойства:

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}"
    )

или в проекте динамической библиотеки XCode Target -> Build Setting set Динамическая библиотека установить имя базы в @rpath


Я создаю проект динамической библиотеки фреймворка Cocoa, он работает, и по сравнению с моим плохим проектом, сгенерированным cmake, нахожу это другим, и исправил его, он работает на iOS.
cn00

2

если вы используете virtualenv, просто удалите папку вашей среды и создайте ее заново с помощью этой команды virtualenv --python=/usr/local/bin/python3 the_name_of_my_env


1

Для тех, кто заходил на эту страницу, потому что они получили эту ошибку, пытаясь связать сторонний фреймворк со своим проектом с использованием Xcode 6.3.1, я столкнулся с проблемой, заключающейся в том, что библиотека создавалась со старой версией компилятора, использующего другую версию быстро. Единственный способ исправить это для меня - перестроить фреймворк.

Другая причина, по которой вы можете получить это, изложена в техническом документе Apple.

Если вы создаете приложение, которое не использует Swift, но встраивает контент, такой как интегрированная среда, Xcode не будет включать эти библиотеки в ваше приложение. В результате ваше приложение будет зависать при запуске с сообщением об ошибке, которое выглядит следующим образом:

установите для встроенного содержимого, содержащего Swift Code (EMBEDDED_CONTENT_CONTAINS_SWIFT), значение сборки в приложении YES

Вот ссылка на полный Apple документ, который объясняет это здесь


1

Для моего фреймворка я использовал подпроект Xcode, добавленный как подмодуль git.

Я думаю, что я получил эту ошибку, потому что я подписывал фреймворк с другой командой подписи чем мое основное приложение. (переключил команды для приложения; забыл переключиться на фреймворк)

Решение заключается в том, чтобы не подписывать в рамках проекта. Вместо этого в разделе основного приложения Target > General > Frameworks, Libraries, and Embedded Contentподпишите структуру через Embed & Sign.

Если я выберу Do not Embedили Embed Without Signingя вместо этого получу ошибку:

FRAMEWORK недопустим для использования в процессе с проверкой библиотеки: в отображаемом файле нет cdhash, полностью без знака? Код должен быть подписан как минимум.


1

Xcode 11.1 и Swift 5.1

Быстрая починка

Сначала убедитесь, что во внешней добавленной библиотеке есть опция embed, которая выбрана на вкладке General, Embbed Binaries.

Если все еще не работает ..

Это происходит потому, что у вас есть разные, не имеющие аналогов версии библиотек.

Обновите стручки

pod update

Важно: убедитесь, что все библиотеки включены в список параметров сборки -> библиотеки и фреймворки, и у вас есть возможность встроить их в сборку

Просто работает потрясающе


0

Для тех, кто испытывает то же самое с другой библиотекой или пакетом, @ user3835452 находится на правильном пути. Я нашел это сообщение при попытке запустить 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

Перепробовав много разных способов, я просто побежал, brew install openldapи это исправило. Обратите внимание , что я уже бежал brew updateи , brew upgradeно только после того, как я вручную установить openldapэто сделал на самом деле работы.


0

Я исправил это, переустановив Homebrew

Удалить

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

устанавливать

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


0

Есть ли простой способ это исправить?

Я просто использовал brew upgrade <the tool>. В моем случае brew upgrade tmux.


0

Я столкнулся с проблемой сбоя приложения, цитируя ошибку SIGABRT в потоке. Обзор сбоя - библиотека dyld не загружена, и изображение не нашло что-то подобное.

Это было видно в Xcode 9.3. Причина, по которой я узнал, состояла в том, что XCode не собирает библиотеки динамически, поэтому мне пришлось сделать это вручную, что решило мою проблему сбоев.

Выполните следующие шаги:

  1. Перейти к этапам сборки
  2. Нажмите кнопку «+» вверху и выберите «Фаза создания нового файла»
  3. Выберите Destination as Frameworks и нажмите кнопку «+» ниже, чтобы добавить файлы.
  4. Выберите Добавить другое в нижней части, нажмите CMD + SHIFT + G и вставьте путь ниже, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos

Теперь вы сможете увидеть некоторые быстрые библиотеки, выберите все быстрые библиотеки с расширением .dylib и нажмите «Открыть».

Они будут добавлены во встроенные двоичные файлы на вкладке «Общие» приложения.

Создайте новую группу в папке проекта и добавьте все эти библиотеки.

Теперь запустите ваше приложение.


0

Если вы используете среду Conda в терминале, обновите samtools, чтобы решить ее.

Конда установить -c биоконда samtools


0

Лучший ответили выше, сначала проверьте, каков результат

otool -L

А затем сделайте следующее, если неверно

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

И

set_target_properties(
        MyTarget
        PROPERTIES
        XCODE_ATTRIBUTE_DYLIB_INSTALL_NAME_BASE 
        "@rpath"

0

это должно решить проблему

brew update
brew upgrade
brew cleanup

1
Пожалуйста, добавьте пояснения к своему ответу, чтобы другие могли извлечь из него урок
Нико Хаас


-1

Для тех, кто все еще может иметь эту проблему:

Это постоянная проблема со стороны Apple, и для меня сработало обновление до ios 13.4 (бета). Установил, что и работал как шарм.


это не проблема IOS.
JBarros35
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.