Mac动态库的install name

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

你可能感兴趣的:(macos)