某次 Mac 更新后,.dylib 减少了 install name 一说。明天回归工作第一天,依赖了动静库的 mac 我的项目调试运行不起来,提醒“@load_path/libxxx.dylib”找不到。好吧,来纠缠一会。
查找了材料,发现上面的文章解说得比拟明确。
Mac OSX 中的 @executable_path, @load_path 和 @rpath 的了解
总结:
动静库生成时,会有一个装置名,包含门路和名称。门路能够是绝对路径,也能够是相对路径。当有我的项目依赖它时,会把这个装置名作为依赖项记录下来。在启动的时候,依据这个装置名,去查找该动静库。
如何查看门路
otool -L xxx.dylib /otool -L xxx.app
对于.dylib,第一个就是它的装置门路。其余的是依赖的动静库门路。
* 注:装置名里的名字,就是它的全名。libxxx.dylib 和 xxx.dylib 不是同一个货色。* 注 2:库的装置门路是能够批改的。这里就不讲了。
三种相对路径
@executable_path
可执行文件所在门路,如果我的项目是 xxx.app,则 @executable_path 为 xxx.app/Contents/Macos
@load_path
对于 plugin 所援用的动静库,门路在 plugin 上面,详情见下面的文章。如果是.app,则和 @executable_path 是一样的。
@rpath
这个设置最灵便,就像动态库的库门路一样。通过它,能够为一个我的项目设置多个 rpath。毛病就是依赖 @rpath 的,还须要额定设置 @rpath 门路。
* 注:xcode 通过 Build Settings -> Linking -> Runpath Search Paths 来设置。
Mac 调试不正确问题解决
计划一
理解了以上三个目录的正确地位,就能轻松把 libxxx 的 install name 调整正确了。名字也要改成一样的。
计划二
间接删除 install name 的设置。生成的.dylib 会以生成地位的绝对路径作为 install name 记录到动静库中。