Qt 5 在 Mac 下使用 HomeBrew 的动态链接库的问题

原创
2017/07/25 14:02
阅读数 931

HomeBrew是一个Mac下很强大的包管理器。在Qt的工程文件中使用起来也非常方便。然而在最近一段时间发现了很多问题,在此记录一下,希望能帮到需要的人。如果您使用的是Flint或者MacPorts,也可以参照此文。

在pro文件中使用HomeBrew安装的库

Qt中使用HomeBrew的库的方法非常简单,只需要将头文件所在目录以及库所在目录添加到pro中即可:

# Brew configure. Use brew to install all your libs, e.g. FFMpeg.
INCLUDEPATH += /usr/local/include/
LIBS += -L/usr/local/lib/

HomeBrew的库全部安装在/usr/local下。每个库具体的文件在该目录下的Cellar目录中,Cellar里每一个文件夹即为一个包名。/usr/local/bin以及/usr/local/lib下的符号链接的文件大多指向这里。

利用这一点,可以将自己所有的额外库全都放在这里,以方便Qt找到这些库。当然,放到Qt的安装目录下也可以。

然而噩梦就此开始

如何在Mac下发布带链接库的Qt项目

Qt提供了一个非常好用的工具,macdeployqt。这个工具免去了我们一个一个复制文件一个一个修改链接符号的麻烦。

改工具的使用方法也非常的简单粗暴,将app所在路径作为参数传给它即可:

./macdeployqt application.app

然后使用otool查看,大部分的库都已经指向到app所在路径下的Content/Frameworks文件夹里,只有个别的库仍需要手动通过install_name_tool工具更改到当前目录下。然后,你就可以发布你的软件了……

吗?

或许可以这么干,但是有的时候,等待你的是被用户告知,你的软件崩溃了。

dyld: Library Missing

前几天发布了µ的新版本之后,很快收到了Mac用户的反馈:程序无法运行,是崩溃的。当时我已经在两个机器上做过了测试,都没能重现这个问题。直到借了一台完全没装过库的Mac,看到了崩溃日志。

日志上写的是:找不到库/usr/lib/Celler/.../libavcodec.57.dylib,从mu.app/Content/Framework/libavutils.xx.dylib里引用。

我当时觉得很奇怪,这个库我已经通过install_name_tool把路径改到了该目录下,为什么还会去原来HomeBrew所在的文件夹去找呢?然后我好像明白了什么。

下意识的用otool -L查看了mu.app/Content/Framework下FFMpeg库的链接信息。果不其然,macdeployqt修改了一部分,然而还有很多部分没有修改,其中就包括这个引用。

然后手动使用了install_name_tool改写了所有的库的位置,然后再次运行,问题成功解决。

后文

这次事件发生的很紧急,而且在开发机上这个问题是无法重现的,因为在开发机上,因为HomeBrew的环境变量设置,FFMpeg的库是永远可以找到的。

而自己的Mac开发机一共只有两台,一台是OS X 10.9.5,一台是macOS 10.12.5。周围使用Mac的人虽然多,但是都不方便去借,故而没有进行新机测试。Windows、Linux在发布之初都经过虚拟机上的全新环境测试才进行发布。本来想着Mac OS X上不会出现什么问题没有做新机测试。但是没想到Mac上动态链接库的依赖地址是记录完整的路径的,导致了问题的发生。

在Mac OS X下发布软件,有关动态链接库的注意事项大概就是两点:一、将动态链接库复制到app的Contents里面,二、检查动态链接库的路径。使用macdeployqt可以解决大部分问题,但是需要再次用otool -L 检查是否有遗漏,因为动态链接库本身也会记录其本身依赖的库的路径。如果发现有路径没有更改,使用install_name_tool更新路径即可。

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部