之前小沃写了一篇在windows下实现静态编译Qt5.6.3的文章,由于受到国家号召,小沃所在公司正在慢慢转变使用操作系统为deepin,因此最近也研究了下如何在deepin v20下实现静态编译的方法。下面与大家分享一下:
一、首先,对Linxu下UI程序新的理解
由于Linux的发行版特别多,而且很多发行版的图形显示库不提供静态编译库,因此无法做到一个可执行文件支持所有的发行版,并且也无法做到真正的静态编译。因此我们只能做到对Qt库的静态编译,发行版需要安装与Qt库相对应的glibc,libxcb等文件。
二、安装编译需要的依赖文件
目前发现编译需要下面4个依赖:
apt-get install pkg-config build-essential libx11-dev python -y
pkg-config是用于返回库函数的调用路径的,用于编译时减少不必要的问题,也可以帮助可执行文件预先寻找所需要的依赖实际路径。
build-essential是用于安装gcc,make,glibc等文件的,是开发linux的常用组件。
libx11-dev是x11,UI显示环境的开发库,提供开发图形化工具的库与函数,比如编译Qt Linux版本需要添加的-xcb。
libfontconfig-dev是用于提供编译好的程序所需要的中文支持的。
上面4个库经过测试,都可以在编译完成后删除。无需保留。
三、裁剪
将5.6.3\Src中,除了文件夹qtbase的其他文件夹全部删掉(只删除文件夹)或是保留几个需要使用的,比如qtserialport,我们只编译核心功能。可以根据实际需求保留特定的文件夹。
小沃运行的是如下完整命令如下:
./configure -prefix /opt/Qt/Qt5.6.3/5.6.3/staticlib -release -opensource -confirm-license -static -force-pkg-config -qt-xcb -qt-xkbcommon-x11 -xkb-config-root /usr/share/X11/xkb -no-glib -no-icu -qt-zlib -qt-libpng -qt-libjpeg -qt-pcre -qt-freetype -no-largefile -no-qml-debug -no-openssl -no-opengl -nomake examples -nomake tests
(1)需要根据自己Qt的实际安装路径修改/opt/Qt/Qt5.6.3/5.6.3/staticlib
(2)-qt-xcb必须添加,否则运行程序会提示找不到xcb插件。
(3)-no-glib -no-icu -qt-zlib -qt-libpng -qt-pcre -qt-freetype是为了减少对动态链接库的依赖,提高跨平台的程序兼容性。
(4)-no-largefile不编译大文件支持,-no-qml-debug不编译qml的debug功能,-no-openssl不编译ssl支持,均是为了减小程序体积的。
(5)这个命令只添加了最基础的Qt支持,以下是可选修改
-opengl desktop 替换-no-opengl让其支持opengl库
四、编译
make -j 8
8为cpu核心数,这个数字最好是与cpu核心数一致,可充分利用多核特性。
五、安装
make install
六、使用
以后使用需要将/opt/Qt/Qt5.6.3/5.6.3/staticlib/bin添加到环境变量中去,然后通过qtcreate开发完毕程序后,整个程序的工程通过命令行运行如下命令即可。
qmake
make
最后就会在工程文件下的release下看见编译出的东西了。
注:网上有的说需要先运行qmake -project,这是为了生成qt工程文件。其实如果前期你是通过qtcreate开发的,那么qtcreate已经帮你把工程文件生成好了,这步是可以跳过的。
最后注意一点,本方法编译文件是依赖了Qt源代码的,所以通过本方法生成的文件是需要遵从LGPL协议而向使用者开放源代码的。
文章作者:沃航科技