最近公司项目在使用动态库时,在运行时经常会报dyld: Library not loaded的问题,现总结下:
1,在 Mac 系统中,默认搜索库的路径是 /usr/lib ,并不像 Windows 一样 dll 放在和 exe 同级目录下也会被搜索到。即便你把动态库放到了.app的包里面了,在打开app运行时还是不能加载。因此会产生dyld: Library not loaded的问题。
2,掌握下mac xcode里面的几个路径含义:
@executable_path 这个变量表示可执行程序所在的目录. 比如 /path/QQ.app/Contents/MacOS/
@loader_path 这个变量表示每一个被加载的 binary (包括App, dylib, framework,plugin等) 所在的目录.
在一个程序中, 对于每一个模块, @loader_path 会解析成不用的路径, 而 @executable_path 总是被解析为同一个路径(可执行程序所在目录). 比如一个会被多个程序调用的 plugin, 位于 /path/Flash Player.plugin/Contents/MacOS/Flash Player, 依赖 /path/Flash Player.plugin/Contents/Frameworks/XPSSO.dylib. 那么 XPSSO.dylib 的 INSTALL_PATH 可以设置为 @loader_path/../Frameworks, 这样设置的话, 不论 Flash Player.plugin 目录放到什么位置, XPSSO.dylib 都能正确的被加载.
这个@loader_path是指被加载时的路径,意味着制作方的这个XPSSO.dylib动态库在使用时,使用方一定要放在可执行文件的上一级目录的Frameworks文件夹下面,这样一来Flash Player.plugin就可以放在在app里