关于Xcode dyld: Library not loaded: image not found
今天新任务需要用到一个framework,但是build出来执行的时候一直报:dyld: Library not loaded
百度google尝试了N多方法都不work,果然一千人就有一千个哈姆雷特,没想到连问题都会这样。
解决方案:
首先,导致这个错误最直接的原因是,你没有在你的项目里面link你需要的library资源,确保你有做link的动作。
当link动作做了之后,如果还出现问题,那么我们先看错误提示,首先,要明确一点,为什么会提示rpath下的framwork not loaded?
看起来问题就是出在path的地方不match,我一开始有针对这个路径问题去尝试解决,但是都不work.
尝试 一:
-
单纯设定framework search paths, build出来就直接报错,image not fond.
-
尝试在general里面,选择framework将其改为embed witout signing.可以build,但是执行的时候依旧报错。
这样看起来问题是,我build出来的执行档执行期间run的path 跟我default设定的不一样,因为我一开始有嵌入framework所以它可以成功执行build出来。
尝试 二:
- 单纯设定runpath search paths,发现报错,提示接口文件not found
让我万万没想到的是,当我尝试将run path search path 和 framework search path 均设定指定路径的时候,竟然可以build出来执行了,也不需要我一开始将framework 嵌入到project里的动作即可。
总结:
-
在使用静态库framework的时候,一定要设置Runpath search path 和Framework search path,这2个地方分别作用于:程序执行后(build出来执行),和执行前所load的环境(build所需要的环境),不管你是通过嵌入的方式让他可以build执行还是其他方法, 这2处地方的path 一定要设定。
-
在调用dylib的时候,也需要注意path的设定。一般我们会在Run Scipt里面做一个path 加载设定。脚本如下:
1. install_name_tool -change @rpath/xxx.dylib @executable_path/xxx.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH
2. manually copy xxx.dylib to the same directory where the CLI is.