某次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记录到动静库中。