本次打包的QT主程序为QWebEngine模块编写的浏览器
1.安装qt
在qt官网或者镜像网站下载qt安装程序。https://download.qt.io/
比如我的电脑是x86_64的,系统是linux,所以下载
实际上由于我的电脑可以上网,并且源中就有qt,所以执行命令
sudo apt -y update
sudo apt -y install qtcreator qt5-default qtdeclarative5-dev build-essential g++ cmake
然后等待安装完毕。
同时由于使用了webengine模块,需要安装对应的模块
执行命令
sudo apt-get install qt5webengine-dev进行安装
然而我的源里没有qt5webengine-dev
于是在debian的应用安装包的网站直接找webengine的deb包。
http://ftp.de.debian.org/debian/pool/main/q/
或者搜索qt5webengine-dev找到对应的安装包。下载后放到系统中安装。
在安装QWebengine模块前需要先安装qtmultimedia
还是在这里下载:http://ftp.de.debian.org/debian/pool/main/q/qtmultimedia-opensource-src/
之后就可以在qtcreator里愉快的编程了
2.程序打包依赖提取:Linuxdeployqt
应用程序编写完成后,就要根据程序的依赖来进行打包,首先需要整理好程序需要的环境和依赖。这里选择linuxdeployqt来进行打包。
首先在https://github.com/probonopd/linuxdeployqt/releases下载了可执行文件linuxdeployqt-x86_64.AppImage。
然后终端输入vim ~/.bashrc命令,修改 .bashrc 文件,加上qt安装的路径:
#add QT ENV
export PATH=/home/zlkj/technology/5.12.7/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/zlkj/technology/5.12.7/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/zlkj/technology/5.12.7/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/zlkj/technology/5.12.7/gcc_64/qml:$QML2_IMPORT_PATH
我这里安装都是默认装到系统路径,所以不用配置上面的qt路径,在系统中就可以找到qt文件。
新建一个文件夹,/Test。然后将程序放在文件夹中。将可执行文件拷贝到该文件夹并使用chmod -x linuxdeployqt-x86_64.AppImage赋予可执行权限。
执行:./linuxdeployqt-x86_64.AppImage app(程序名) -appimage
报错了:
这个打包程序要求glibc的版本要小于等于2.7,我的版本是2.9
于是下载了linuxdeployqt的源码包:https://github.com/probonopd/linuxdeployqt。
打开路径tools/linuxdeployqt/main.cpp把glibc限制的这一块注释掉:
// openSUSE Leap 15.0 uses glibc 2.26 and is used on OBS
// Ubuntu Xenial (16.04) uses glibc 2.23
// Ubuntu Bionic (18.04) uses glibc 2.27
/if (strverscmp (glcv, "2.28") >= 0) {qInfo() Latest continuous linuxdeployqt build does not work on Ubuntu 16.04 LTS and openSUSE Leap 15.0 · Issue #340 · probonopd/linuxdeployqt · GitHub";return 1;}/
同时可以看到对于这块的说明:不检查glibc的话,可能会导致生成的映射程序、文件夹等在较老的系统中不起作用
注:如果应用程序要放在各种不同的Linux环境中,最好还是在glibc版本较低的系统中打包,如果目标系统的glibc不支持打包的系统的glibc版本,将无法运行。
查看glibc版本的方法:终端输入ldd -version
保存后,来到最外层cmakelists.txt这一层。执行cmake .,生成Makefile,执行make,生成程序。
然后提示了git的错误(这个错误好像没啥影响)。
好吧,又git clone了一下源码,重新注释,cmake,make。生成成功。
将生成成功的程序拷贝到/Test文件夹下,执行./linuxdeployqt-x86_64.AppImage app(程序名) -appimage
没有glibc的报错了。报了个Desktop的错误,这个可以忽略,后面打包才会用到。
执行完之后看看提取的文件。就多了个lib文件夹,打开文件夹里面只有孤零零的一个动态库:libqwebenginecore.so
没有详细查找问题原因。注释代码时发现linuxdeployqt有一个参数:
可以用来忽略glibc版本的错误。
又拷贝了刚开始下载的执行程序。执行./linuxdeployqt-x86_64.AppImage app(程序名) -appimage。
结果:
提取了很多文件。
需要注意的是,他只会提取程序依赖的静态加载的库,如果是动态加载的库以及动态加载库的依赖库,是无法提取到的。
此时可以对动态加载的库也使用linuxdeployqt来提取下依赖文件
提取到的依赖库都被拷贝到了lib文件夹。同时app程序指向的库也被处理到了lib文件夹下。
将程序动态加载的库根据代码中动态加载的路径放置好。执行程序。
报错:
好像是webengine中依赖的用来解析域名等的库,将计算机中的nss文件夹直接全部拷贝到此目录的lib下。运行./AppRun,程序执行成功,浏览器弹出。
3.打包
参考debian文件打包
想深入了解可以阅读Debian 新维护者手册
https://www.debian.org/doc/manuals/maint-guide/index.zh-cn.html