dyld:未加载库...原因:找不到图像


291

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

有简单的方法可以解决此问题吗?


如果您仍然有使用本主题的
塔里克

Answers:


171

查找所有增强库:

$ 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您能在这里解释一下exefile是一个工具exec文件路径吗?是不是?
VenushkaT 2014年

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
我应该添加什么?文件很多
Joe Sleiman

@Himanshu我的项目有libcppreset!它有很多来自boost的依赖,我运行bash脚本使用install_name_tool更改它们,但是对于LC_ID_DYLIB我来说,不需要在usr / loca / opt中建立符号链接!有什么办法找出来?:| 这很痛苦:(
Mo Farhand

83

这为我工作:

brew upgrade node

7
不过,这是在做什么?
diegoaguilar,

3
@diegoaguilar,这是node使用自制软件重新安装的。可能是另一个安装破坏了节点路径。也为我工作。
雨果·南戈拉

68

将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

2
最近更新xcode时,我的intelliJ开始引发此错误。我试图通过intellij运行node.js服务器。我不确定出了什么问题。node --version在我的系统上运行导致相同的错误。运行以上两个命令解决了我的问题。
伊桑

3
就我而言,我还运行了该brew cleanup命令,如果您希望摆脱旧版本,有时可以这样做。
Michael Behrens

关于@MichaelBehrens的评论,我运行 brew cleanup然后将其修复。
Buraco

37

对于某些人来说,这就像设置动态库的系统路径一样容易。在OS X上,这就像设置DYLD_LIBRARY_PATH环境变量一样简单。看到:

在Mac OS X上可以使用DYLD_LIBRARY_PATH吗?而且,动态库搜索算法是什么?


可能看起来很愚蠢,但我想知道应该设置什么值DYLD_LIBRARY_PATH
凯撒

1
@Caesar将其设置为您要链接的dylib所在目录。
markshiz

您不能指望用户会改变DYLD_LIBRARY_PATH。正确的解决方案是将包含非标准库,.app而用户则无需执行任何操作。但是,根据我的回答,开发人员可能仍然需要破解加载程序路径。
trojanfoe

12

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

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


人们需要停止建议这样做brew upgrade。这可能会严重破坏整个系统。相反,隔离需要升级的内容并仅对其进行升级。
Jivan

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如图所示,这样您就可以进行了。

在此处输入图片说明

对于11以下的Xcode版本:

只需在本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 FolderCommandShiftK)修复了这个问题,这使新的构建变得很奇怪。


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中将Dynamic Library Install Name Base设置@rpath


我创建了一个可可框架动态库项目,它可以工作,并且与我糟糕的cmake生成的项目进行比较,发现它有所不同,并进行了修复,它可以在iOS上运行。
cn00

2

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


1

对于任何因使用Xcode 6.3.1尝试将第三方框架链接到他们的项目而出错的人,我遇到的问题是因为该库是使用较旧版本的编译器使用不同版本创建的迅捷 为我解决此问题的唯一方法是重新构建框架。

Apple技术文档中说明了可能得到此结果的另一个原因。

如果您要构建的应用程序不使用Swift,但是要嵌入诸如框架之类的内容,则Xcode不会在您的应用程序中包含这些库。结果,您的应用在启动时将崩溃,并显示一条错误消息,如下所示:

在您的应用中将嵌入式内容包含快速代码(EMBEDDED_CONTENT_CONTAINS_SWIFT)构建设置设置为YES

这是在这里解释它的完整Apple文档的链接


1

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

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

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

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

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


1

Xcode 11.1和Swift 5.1

快速解决

首先,请确保在“常规”选项卡“嵌入二进制文件”中选择了外部添加的库具有“嵌入”选项。

如果还是不行。

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

更新荚

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 updatebrew 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. 选择目标作为框架,然后单击下面的“ +”按钮添加文件。
  4. 选择下面的添加其他,单击CMD + SHIFT + G并粘贴以下路径, /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos

现在您将能够看到一些swift dylib,选择所有扩展名为.dylib的swift库,然后单击open。

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

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

现在运行您的应用程序。


0

如果您在终端中使用Conda环境,请更新samtools来解决。

康达安装-c bioconda samtools


0

最好的答案是在上面首先检查什么是输出

工具-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"


-1

对于可能仍然存在此问题的任何人:

苹果方面这是一个持续存在的问题,对我有用的是升级到ios 13.4(beta)。安装并像魅力一样工作。


这不是IOS问题。
JBarros35
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.