打包 Qt 应用时关于动态链接库的一些注意事项

在软件发布的时候经常会遇到, 动态链接库找不到的问题, 而且这种问题处理起来还非常麻烦, 因为在本机是开发环境的原因问题经常无法暴露出来, 所以这就坑了, 线面来说说如何避免这种问题的出现.

首先你需要安装一个干净的操作系统, 使用虚拟机就好了, 保持你的虚拟机和你开发的电脑在同一个网段内(Ps: 方便传输数据)

如何安装虚拟机这里就不细说了, 网上搜索一大堆资料.

  1. 打包好后, 吧包传到虚拟机内
  2. 打开可执行程序, 如果能正常打开, 那么表示你的库连接没有问题
  3. 如果弹出提示框, 说你缺少什么, 那么你需要到你的开发环境里去找到这个库, 然后拷贝到可执行程序同目录下的的Frameworks目录里, 直到程序可运行

细节

不同平台之间的一些细微差别

macOS

macOS 平台如果出现问题, 会弹出一个崩溃框, 点击报告按钮, 可以看到崩溃日志, 里面会告诉你除了什么问题, 按照提示操作即可

当你的Frameworks目录下确实存在这个运行库的时候, 还是爆类似如下的错误时, 可检查是否是链接库的链接位置有问题

1
2
3
4
5
6
7
8
9
Termination Reason:    DYLD, [0x1] Library missing

Application Specific Information:
dyld: launch, loading dependent libraries

Dyld Error Message:
Library not loaded: /usr/local/Cellar/openssl/1.0.2k/lib/libcrypto.1.0.0.dylib
Referenced from: /Applications/MyApp/MyApp.app/Contents/Frameworks/libssl.1.0.0.dylib
Reason: image not found

查看链接位置

1
2
3
4
5
6
7
$ cd MyApp.app/Contents/Frameworks
$ otool -L libssl.1.0.0.dylib

libssl.1.0.0.dylib:
@executable_path/../Frameworks/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/Cellar/openssl/1.0.2n/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

通过上面可知, 确实是链接位置有问题, 应该是一个相对路径才对

修改链接位置

1
$ install_name_tool -change /usr/local/Cellar/openssl/1.0.2n/lib/libcrypto.1.0.0.dylib @executable_path/../Frameworks/libcrypto.1.0.0.dylib libssl.1.0.0.dylib

Linux

Linux 平台需要使用终端运行可执行程序, 因为自己双击打开可执行程序, 无法查看错误日志.

Windows

Windows 平台和 macOS 平台太类似, 只不过 Windows 平台太会直接告诉你出了什么问题

需要注意的是: 如果出现了api-ms-win-crt-runtime-l1-1-0.dll丢失, 那么意味着客户机没有安装运行库, 安装msvc2016_x64或者msvc2016_x32即可, google 一下就可以查看到详情了, 这里不细说了

参考资料

https://forum.qt.io/topic/81180/library-not-loaded-usr-local-cellar-openssl-1-0-2k-lib-libcrypto-1-0-0-dylib

https://stackoverflow.com/questions/33991581/install-name-tool-to-update-a-executable-to-search-for-dylib-in-mac-os-x