【问题标题】:dyld: Library not loaded ... Reason: Image not founddyld:库未加载...原因:找不到图像
【发布时间】:2013-07-16 05:25:09
【问题描述】:

在尝试运行我在 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

我已经安装了 boost 库,它们位于/opt/local/lib。我认为这个问题与可执行文件有关,它只在它所在的目录中查找,就像我在其中粘贴“libboost_atomic.dylib”时一样,它不再介意它了。不幸的是,它抱怨找不到下一个 boost 库。

有没有简单的方法来解决这个问题?

【问题讨论】:

标签: macos dylib dyld otool install-name-tool


【解决方案1】:

找到所有的 boost 库(exefile 是您的可执行文件的名称):

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

手册页:otoolinstall_name_tool

编辑 不久前,我编写了一个 Python 脚本 (copy_dylibs.py),以便在构建应用程序时自动解决所有这些问题。它会将/usr/local/opt/local 中的所有库打包到应用程序包中,并修复对这些库的引用以使用@rpath。这意味着您可以使用 Homebrew 轻松安装第三方库并同样轻松地打包它们。

我现在已经在github 上公开了这个脚本。

【讨论】:

  • @trojanfoe 你能在这里解释一下什么是 exefile 是工具 exec 文件路径吗?不是吗?
  • 重新编译可执行文件后,我必须重复这个过程——在开发过程中很烦人。
  • 其实更好的办法是使用DYLD_LIBRARY_PATH修改搜索路径。另一个答案是这个。
  • 'exefile': 没有这样的文件或目录
  • @ScottyBlades exefile 代表您尝试运行的可执行文件。就我而言,otool -L /usr/local/bin/php 成功了。
【解决方案2】:

这对我有用:

brew upgrade node

【讨论】:

  • 这是在做什么呢?
  • @diegoaguilar 这是使用自制软件重新安装node。可能另一个安装破坏了节点路径。也为我工作。
  • 更新 macOS Catalina 后它对我有用。谢谢!
  • 这里也一样,我用brew upgrade node (OSX Catalina) 修复了它
  • 这应该是公认的答案。为大多数人省去很多麻烦。
【解决方案3】:

在目标的General选项卡中,有一个名为Frameworks, Libraries, and Embedded Content的部分

点击+标志,添加必填framework即可解决崩溃问题。

【讨论】:

  • 我应该添加什么?有很多文件
  • @Himanshu 我的项目有 libcppreset!它与 boost 有很多依赖关系......我运行一个 bash 脚本来使用 install_name_tool 更改它们,但是对于LC_ID_DYLIB,我不需要在 usr/loca/opt 中创建一个符号链接!有什么办法可以弄清楚吗? :|这很痛苦:(
  • 添加框架并将框架设置为Embed & Sign
【解决方案4】:

Mac OS 升级到 Mojave 后。我尝试通过yarn 命令安装 npm 模块,但出现错误:

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

【讨论】:

  • 最近更新 xcode 时,我的 intelliJ 开始抛出此错误。我试图通过 intellij 运行 node.js 服务器。我不确定出了什么问题。在我的系统上运行 node --version 会导致同样的错误。运行以上两个命令解决了我的问题。
  • 在我的例子中,我还运行了brew cleanup 命令,如果您想摆脱旧版本,有时这样做是件好事。
  • 关于@MichaelBehrens 的评论,我运行brew cleanup 然后它修复了。
【解决方案5】:

对于某些人来说,这可能就像为动态库设置系统路径一样简单。在 OS X 上,这就像设置 DYLD_LIBRARY_PATH 环境变量一样简单。见:

Is it OK to use DYLD_LIBRARY_PATH on Mac OS X? And, what's the dynamic library search algorithm with it?

【讨论】:

  • 这可能看起来很愚蠢,但我想知道我应该将DYLD_LIBRARY_PATH 设置为什么值?
  • @Caesar 将其设置为您尝试链接的 dylib 所在的目录。
  • 你不能指望你的用户改变DYLD_LIBRARY_PATH。正确的解决方案是在.app 中包含非标准库,用户无需执行任何操作。但是,根据我的回答,开发人员可能仍然需要破解加载器路径。
【解决方案6】:

这应该可以解决问题

brew update
brew upgrade
brew cleanup

【讨论】:

  • 使用它对我有用,不幸的是,我仍然不知道问题的原因是什么,或者为什么更新、升级和清理可以解决问题
  • 这对我来说完全有效,但是,在尝试进行清理时,我遇到了一些权限问题,如果您也遇到此问题,请尝试运行 sudo chown -R $(whoami) /usr/ local/lib 然后尝试再次运行 brew cleanup
  • 运行后我仍然得到ImportError: cannot import name 'ssl' from 'urllib3.util.ssl_' (/Users/foo/.local/share/virtualenvs/TMIWqqTS/lib/python3.7/site-packages/urllib3/util/ssl_.py)
  • 我通过重新安装 python 修复了我的后续错误。我使用 asdf 来管理我的语言版本,所以我做了 asdf uninstall python 3.7.3(我使用的是 3.7.3,在此处指定您拥有的版本)然后运行 ​​asdf install python 3.7.3
  • 如果不工作:brew services start php
【解决方案7】:

当我尝试使用 rvm 安装 ruby​​ 2.3.1 时出现此错误。它首先告诉我运行 brew update,我这样做了,然后当我尝试运行 rvm install ruby-2.3.1 时,我收到了这个 SO question 中的错误。

解决方法是首先运行brew upgrade,显然根据这个superuser.com 问题,您需要同时执行brew update && brew upgrade。完成后,我终于可以安装 ruby​​ 2.3.1。

【讨论】:

  • 人们需要停止推荐这样做brew upgrade。这可能对一个人的整个系统造成巨大的破坏。相反,隔离需要升级的内容并仅升级。
【解决方案8】:

现在 Xcode 已经升级了他们的 IDE,他们稍微改变了这个功能。

它曾经被分成单独的部分,如上所示,“嵌入式二进制文件”和“链接的框架和库”作为单独的部分。

现在,它是一个组合部分,右侧带有下拉菜单,用于指示应嵌入的内容。

起初这让我感到困惑,但现在完全有道理。

【讨论】:

    【解决方案9】:

    如果您使用的是 Xcode 11 及更高版本:

    转到General 选项卡并在Frameworks, Libraries, and Embedded Content 部分添加框架。

    重要提示:默认情况下它可能标记为Do Not Embed,将其更改为Embed Without Signing,如图所示,您就可以开始了。

    对于 11 以下的 Xcode 版本:

    只需在Embedded Binaries 部分添加框架即可。

    干杯!

    【讨论】:

      【解决方案10】:

      要解决我的 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
      

      【讨论】:

      • 对此的任何解释都会有所帮助。
      • 在我看来,可执行文件甚至不应该链接到 libssl.1.0.0.dylib,而是链接到 libssl.1.dylib,它将符号链接到系统上的确切版本,同时保持 API 兼容性。见this
      【解决方案11】:

      您可以对可执行文件使用带有 -L 选项的 otool 命令,这将显示可执行文件期望这些库位于的位置。

      如果需要更改它们的路径,请使用install_name_tool 命令,它允许您设置库的路径。

      【讨论】:

        【解决方案12】:

        在构建阶段制作框架可选对我有用。

        在 Xcode -> Target -> Build Phases -> Link Binary with Libraries -> 确保新添加的框架(如果有)标记为可选

        【讨论】:

          【解决方案13】:

          我来到这里试图运行我刚刚使用 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)
          

          【讨论】:

            【解决方案14】:

            我通过brew install libpng修复它

            【讨论】:

              【解决方案15】:

              如果你使用 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设置Dynamic Library Install Name Base@rpath

              【讨论】:

              • 我创建了一个cocoa框架动态库项目,它可以运行,和我的cmake生成的糟糕项目相比,发现这个不同,并修复它,它可以在iOS上运行。
              【解决方案16】:

              我通过使用 Product > Clean Build Folder (CommandShiftK) 解决了这个问题,这使得一个新的干净构建,真的很奇怪。

              【讨论】:

                【解决方案17】:

                对于我的框架,我使用的是作为 git 子模块添加的 Xcode 子项目。

                我相信我遇到了这个错误,因为我使用 与我的主应用程序不同的签名团队 签署了框架。 (为应用切换团队;忘记切换框架)

                解决方案是在框架项目内签名。相反,在主应用程序的 Target > General > Frameworks, Libraries, and Embedded Content 部分,通过 Embed & Sign 签署框架。

                如果我选择 Do not EmbedEmbed Without Signing 我会得到错误:

                FRAMEWORK 在使用库验证的过程中无效:映射文件没有 cdhash,完全未签名?代码必须至少是临时签名的。

                【讨论】:

                  【解决方案18】:

                  你可以使用sudo install_name_tool -change改变dylib路径 和 sudo install_name_tool -id更改dylib名称

                  【讨论】:

                    【解决方案19】:

                    如果您使用 virtualenv,只需删除您的环境文件夹并使用此命令重新创建它 virtualenv --python=/usr/local/bin/python3 the_name_of_my_env

                    【讨论】:

                      【解决方案20】:

                      Xcode 11.1 和 Swift 5.1

                      快速修复

                      首先确保在General Tab, Embed Binaries中选择了external added library has option embed。

                      如果还是不行..

                      发生这种情况是因为您存在不同的、不匹配的库版本。

                      更新 Pod

                      pod update
                      

                      重要提示:检查所有库都包含在构建设置 -> 库和框架列表中,并且您已提供嵌入构建的选项

                      工作真棒

                      【讨论】:

                        【解决方案21】:

                        在我们的例子中,它是一个 iOS 应用,基于 Xcode 11.5 构建,使用 cocoapods(如果你愿意,还可以使用 cocoapods-binary)。

                        我们看到了这个崩溃:

                        dyld: Library not loaded: @rpath/PINOperation.framework/PINOperation
                          Referenced from: /private/var/containers/Bundle/Application/4C5F5E4C-8B71-4351-A0AB-C20333544569/Tellus.app/Frameworks/PINRemoteImage.framework/PINRemoteImage
                          Reason: image not found
                        

                        原来我必须删除 pod 缓存并重新运行 pod install,所以 Xcode 会指出这个差异:

                        【讨论】:

                          【解决方案22】:

                          对于任何访问此页面的人,因为他们在尝试使用 Xcode 6.3.1 将第三方框架链接到他们的项目时遇到此错误,我遇到的问题是因为该库是使用旧版本的编译器创建的不同版本的 swift。对我来说解决这个问题的唯一方法是重新构建框架。

                          Apple 技术文档中说明了您可能会遇到此问题的另一个原因..

                          如果您正在构建的应用程序不使用 Swift,但嵌入了框架等内容,Xcode 将不会在您的应用程序中包含这些库。因此,您的应用将在启动时崩溃并显示如下错误消息:

                          在您的应用中将 Embedded Content Contains Swift Code (EMBEDDED_CONTENT_CONTAINS_SWIFT) 构建设置设置为 YES

                          这里是完整的 Apple 文档的链接here

                          【讨论】:

                            【解决方案23】:

                            在我的情况下,节点已过期,您需要在升级到 BigSur 后升级它 - brew 升级节点

                            【讨论】:

                              【解决方案24】:

                              https://gist.github.com/berkedel/d1fc6d13651c16002f64653096d1fded所说,你可以试试

                              brew uninstall --ignore-dependencies node icu4c
                              brew install node
                              brew link --overwrite node
                              

                              【讨论】:

                                【解决方案25】:

                                快速修复

                                • 通过在您的 Podfile 中添加注释来删除该 pod(其名称出现在错误中),例如 #Podname
                                • 运行pod install
                                • 取消注释您之前评论过的 pod
                                • 再次运行pod install

                                它对我有用,而且很容易分享它。

                                【讨论】:

                                  【解决方案26】:

                                  对于使用不同库或包遇到相同问题的任何人,@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 updatebrew upgrade,但只有在我手动安装openldap 之后它才真正起作用。

                                  【讨论】:

                                    【解决方案27】:

                                    有没有简单的方法来解决这个问题?

                                    我刚刚使用了brew upgrade <the tool>。就我而言,brew upgrade tmux

                                    【讨论】:

                                      【解决方案28】:

                                      我遇到了在线程中引用 SIGABRT 错误的应用程序崩溃问题。崩溃概述是 dyld 库未加载并且图像未找到类似的东西。

                                      这在 Xcode 9.3 中可以看到。我发现的原因是 Xcode 没有动态获取库,所以我必须手动完成,这解决了我的崩溃问题。

                                      按照以下步骤操作:

                                      1. 转到构建阶段
                                      2. 点击顶部的“+”按钮并选择“新建复制文件阶段”
                                      3. 选择目标作为框架并点击下面的“+”按钮添加文件。
                                      4. 在下方选择添加其他,点击CMD+SHIFT+G并粘贴下面的路径, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos

                                      现在您将能够看到一些 swift dylib,选择所有带有 .dylib 扩展名的 swift 库并单击打开。

                                      这些将被添加到应用程序常规选项卡中的嵌入式二进制文件中。

                                      在项目文件夹中创建一个新组并添加所有这些库。

                                      现在运行您的应用程序。

                                      【讨论】:

                                        【解决方案29】:

                                        如果你在终端使用Conda环境,更新samtools即可解决。

                                        conda install -c bioconda samtools

                                        【讨论】:

                                          【解决方案30】:

                                          上面回答了最好的,首先检查输出是什么

                                          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"
                                          

                                          【讨论】:

                                            猜你喜欢
                                            • 2013-12-25
                                            • 2012-03-20
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2020-05-12
                                            • 2020-01-28
                                            • 2010-11-30
                                            • 1970-01-01
                                            • 2018-03-26
                                            相关资源
                                            最近更新 更多