build dynamic libraries for iOS and load them at runtime

编译了libmt.dylib, 和 test 程序调用,均正常。在xcode中显示调用正常,隐式调用则出现问题。

提示

dyld: Library not loaded.

即使存在在/usr/lib/limt.dylib也同样报错误。 怀疑app运行时没有搜索到此dylib.

  在Mac 平台环境, 动态库(dylib)有一个 “install name”, 这个 安装名字是一个存在动态库里的路径,表明运行时去哪里找库。当连接动态库后,这个路径就保存在二进制文件里,因此程序执行时可以按照这个路径去查找动态库,否则就无法加载此动态库。

正常可以调用的动态库,通otool工具查看install name.

Mac-mini:bin root# otool -L libmt.dylib 
libmt.dylib:
    /usr/lib/libmt.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1214.5.1)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)

这就意味着要么通过设置环境变量DYLD_LIBRARY_PATH 来查找动态库,否则就只能将动态库放在指定的位置,即install name.

可以通过install_name_tool 工具设置 install name, 可以通过@rpath关键字指定相对路径到安装目录,通过@executable_path,@loader_path关键字指定路径到运行目录。

otool 设置install name

 install_name_tool -id "/usr/lib/libmt.dylib" libmt.dylib

或者相对路径

install_name_tool -id "@rpath/lib/libmt.dylib" libmt.dylib

参考

http://www.chilkatforum.com/questions/4235/how-to-distribute-a-dylib-with-a-mac-os-x-application

http://stackoverflow.com/questions/4876740/xcode-keeps-searching-dylib-at-wrong-path

原文地址:https://www.cnblogs.com/iclk/p/4347656.html