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
最后再次使用otool
validation:
$ 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
: otool
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 update
& brew 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的名称