在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,在打开的对话框里面,把刚才的脚本贴进去。