现在的位置: 首页 > 综合 > 正文

mac : dyld: Library not loaded 问题解决

2018年03月18日 ⁄ 综合 ⁄ 共 1086字 ⁄ 字号 评论关闭

在mac中用xcode编写了一个命令行程序,其中引入了一个framework,最终生成一个可执行程序。

在自己电脑上测试一切正常,可到其他mac中使用此程序,报如下错误:

dyld: Library not loaded:
/use/lib/lib1

Referenced from: /use/bin/a

Reason: image not found

Trace/BPT trap

从如上错误中可以看出为运行时/use/bin/a为该命令行程序或者一个库,lib1为依赖的库文件,即最终动态链接时没有链接到lib1库文件,此时,即使将lib1库拷贝到程序所在目录中也不见效。

在xcode中找了好久,查看是否可以指定库路径为相对路径,没有找到。后来,一次偶然发现,可以直接改可执行程序依赖的库,以下为具体方法:

1.查看/use/bin/a的依赖文件,在命令行输入 otool -L /use/bin/a,假设结果如下:

 /use/lib/lib1
(compatibility version 0.0.0, current version 0.1.0) 

 /use/lib/lib2 (compatibility
version 0.0.0, current version 0.1.0) 

............(省略其他依赖库)

从输出可以看出:在可执行文件中将依赖文件写死为/use/lib/lib1,导致我们将其移植到其他机器中时不太好操作,我们只能在所需移植的机器相同位置安放动态库文件,这样操作显然不太好。于是,我们可以将路径改为相对路径,移植到其他机器中,只需要将可执行文件和库放在同一个目录中,拷贝到其他机器中即可正常运行。

2.修改/use/bin/a的依赖文件路径:

install_name_tool -change /use/lib/lib1  @executable_path/lib1 /use/bin/a

 @executable_path为可执行程序的执行目录,网上介绍用@loader_path应该也可以

3.重复以上步骤,将依赖的库均改为相对路径,并拷贝到一个目录中组织起来(如果本身就是app,则可以在app包中进行组织)。

注意:一些库可能仍存在一些依赖关系,操作时需要递归地寻找每个库的依赖关系,并修改路径,具体做法同上。

4.网上说可以写个脚本加载xcode中,具体本人未测试,只是贴出来让大家看看吧:
在xcode中,展开targets节点,右键点工程名称,在菜单中选Add->New Build Phasa->New Run Script Build Phasa,在打开的对话框里面,把刚才的脚本贴进去。


抱歉!评论已关闭.