dyld:Library未加载…原因:图像未加载

当试图运行我在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'时,它不再介意它。 不幸的是,它抱怨它无法find下一个增强库。

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

find所有的增强库:

 $ 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 

最后再次使用otoolvalidation:

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

otoolotool install_name_tool

编辑虽然这不一定与第三方库(如boost或Qt)有关,但是如果您从同一个Xcode项目生成应用程序和.dylib ,则实际上可以在不使用install_name_tool通过设置Dynamic Library Install Name在构build设置。 以下是一个允许应用程序可执行文件从../Frameworks/加载.dylib../Frameworks/

在这里输入图像描述

在目标的General tab ,有一个Embedded Binaries field

添加所需的framework和崩溃已解决。

在这里输入图像描述

点击+号并添加framework

对于某些人来说,这可以像设置dynamic库的系统path一样简单。 在OS X上,这与设置DYLD_LIBRARY_PATH环境variables一样简单。 看到:

在Mac OS X上使用DYLD_LIBRARY_PATH可以吗? 而且,什么是dynamic库searchalgorithm呢?

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

如果path需要更改,请使用install_name_tool命令,该命令允许您设置库的path。

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

该修复是第一次运行brew upgrade ,显然根据这个superuser.com问题,你需要做的两个brew updatebrew upgrade 。 一旦完成,我终于可以安装ruby2.3.1。

我到这里试图运行我刚刚使用CMake编译的程序。 当我尝试运行它时,它抱怨说:

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

我绕过了这个问题,告诉CMake使用静态版本的Boost,而不是让它使用dynamic版本:

 set(Boost_USE_STATIC_LIBS ON) 

对于任何人来到这个页面,因为他们有这个错误尝试使用Xcode 6.3.1链接到他们的项目的第三方框架,我碰到的问题是因为该库是使用不同版本的编译器的旧版本迅速。 解决这个问题的唯一方法是重新构build框架。

你可能会得到这个的另一个原因是在苹果的技术文件中说明的。

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

在应用程序中将embedded式内容包含Swift代码(EMBEDDED_CONTENT_CONTAINS_SWIFT)版本设置设置为YES

这里是链接到完整的苹果文档, 在这里解释它

你可以使用sudo install_name_tool -change改变dylibpath和sudo install_name_tool -id改变dylib的名称