1、背景
2、修改qmake.conf文件
3、准备configure的选项
./configure --help,将所有的configure的选项都罗列出来
3.1顶层安装目录
-prefix 部署目录,make install的部署目录,若未指定则默认在/usr/local/Qt-$QT_VERSION
-extprefix 安装目录,若未指定,则默认安装SYSROOT/PREFIX
-hostprefix 主机上运行的构建工具安装目录,,若未指定,则使用当前的构建目录EXTPREFIX
-external-hostbindir 当前主机的QT工具目录
3.2安装目录精调
包括bin文件目录、头文件目录、库文件目录、架构依赖数据目录、插件目录、辅助程序目录、QML1导入目录、QML2导入目录、架构无关目录、文档目录、翻译(国际化)目录、QT系统配置目录、例程目录、单元测试目录、主机可执行目录、主机库目录、主机数据目录(qmake用的)
3.3 配置元
3.4 编译选项
这个小节,选项比较多,相对重要。
-opensource 和-commercial 是选择编译的是开源版本还是商业版本;
-confirm-license 自动认可证书
-release 、-debug -debug-and-release 默认是-release版本,即关闭调试。 -debug是开启调试的版本、-debug-and-release是编译得到release和debug连个版本
-optimize-debug(在调试构建中建立对调试友好的优化)、-optimize-size(优化按size而非speed)、-optimized-tools(在调试时也构建优化的主机工具)等优化相关的选项
-force-debug-info 在release选项启用时,创建符号文件。(符号表)
-developer-build 编译和连接qt而且加入开发者
-strip 剥离release版本不需要的符号
-gc-binaries 将函数和数据项放入各自的setction,并使能对未使用的段垃圾回收链接
-force-asserts 在release 构建中也使能断言assert功能
-developer-build 编译和连接QT是为了开发QT自身
-shared 编译成动态QT库(共享),软件比较小
-static 编译成静态库
-framework 构建QT框架包(Apple only)
-platform <target> 选择主机mkspec
-xplatform <target> 当使用交叉编译时选择目标mkspec
-device <name> 要交叉编译设备名
-device-option <key=value> 给设备mkspec 添加选项
-appstore-compliant 禁用在app store中不允许用的代码,Android ios/ tvos/watchos
-qtnamespace <name> 将所有QT 库代码封装在指定命名空间内
-qtlibinfix <infix> 给所有的libQt58.so重命名,添加中缀libQt5*<infix>.so
-testcocoon 使用TestCocoon代码覆盖工具进行测试
-gcov 使用GCov代码覆盖工具进行测试
-trace [backend] 使能tracepoints进行测试
-sanitize
-c++std <edition> 选择C++ 标准版本 [c++1z/c++14/c++11]
-sse2 用SSE2指令集
-sse3/-ssse3/-sse4.1/-sse4.2/-avx/-avx2/-avx512 各类指令集
-mips_dsp/-mips_dspr2 用MIPS DSP/rev2 指令集
-qreal <type> 指定qreal指定的类型,默认是double类型
-R <string> 添加一个显式运行库路径到Qt库。支持LIBDIR的相对目录
-rpath 链接Qt库是,将lIBDIR作为运行时库的目录。相当于-R LIBDIR
-reduce-exports 减少输出符号的数量
-reduce-relocations 减少重定向的数目[Unix only]
-plugin-manifests 将声明嵌入插件[Windows only]
-static-runtime
-pch 使用预编译头文件
-ltcg 使用链接时间代码生成器
-use-gold-linker 使用GNU gold链接器
-incredibuild-xge
-ccache 使用编译器缓存 [unix only]
-make-tool <tool> 用指定<tool>去构建qmake [Windows only]
-mp 使用多核处理器进行编译
-warnings-are-errors 将警告当做错误来对待
-silent 减少构建是的输出log
3.5 编译环境
-sysroot <dir> 设置目标sysroot目录
-gcc-sysroot 设置了sysroot,则传递sysroot给编译器
-pkg-config 使用pkg-config
-D <string> 添加显示的宏定义给预编译器
-I <string> 添加显示的头文件包含目录
-L <string> 添加显示的库文件
3.6 组件选择
-skip <repo> 编译是不包括整个代码库
-make <part> 将<part>添加到要构建的列表表中
-nomake <part> 将<part>不涵括在要构建的列表中
-compile-examples 例程是否编译
-gui 构建QT GUi模块和其依赖
-widgets 构建Qt Widgets模块及其依赖
-no-dbus 不构建Qt D-Bus模块
-dbus-linked 构建Qt D-Bus模块并链接成libdbus-1
-dubs-runtime 构建Qt D-Bus且动态加载libdbus-1
-accessibility 使能可访问
下面的都是Qt里绑定的第三方库,默认自动检测是failed,不构建进QT库的。
3.7 第三方库
3.7.1 核心选择
-doubleconversion 选择使用双重转换库,可选的有system、qt、no
-glib 使能支持Glib库,默认时no, auto on Unix
-eventfd 使能eventfd支持
-inotify 使能inoftify支持
-icony 使能iconv(3)支持[可选的有posix/sun/gnu/no](Unix only)
-icu 使能ICU支持
-pcre 选择使用libpcre2类型,可选的有system和qt
-pps 使能PPS支持[Unix only]
-zlib 选择使用zlib类型,可选的有system和qt的;如--zilib=qt
Logging backends: 日志后端支持
Unix可选Journald、syslog支持
3.7.2 网络选择
-ssl 使能任一ssl支持方法
-no-openssl 不使用openssl[Apple和WinRT 默认选择]
-openssl-linked 使用openssl且链接如libssl
-openssl-runtime 使用openssl且动态加载libssl
-securetransport 使用安全传输(Apple)
-sctp 使能SCTP支持(SCTP协议)
-libproxy 使能代理库
-system-proxies 默认使用系统网络代理
3.7.3 GUI、printing、widget 选择
-cups 启用CUPS支持(Unix only)
-fontconfig 启用字体配置支持
-freetype 选择使用的FreeType类型(FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎),可选的有system、qt、no
-harfbuzz 选择使用HarfBuzz-NG,harfbuzz是一个开源的text opentype layout 引擎,可选的有system、qt、no
-gtk 启用GTK平台主体支持
-lgmon
-on-opengl 不启用OpenGL
-opengl <api> 启用OpenGL,具体支持的api有哪些
-pengls3 启用OpenGL ES3.x替代ES 2.x
-egl 启用EGL
-angle
-combined-angle-lib
-xcb-xlib 启用Xcb-Xlib支持
平台后端:
-direct2d 启用Direct2D (Windows only)
-directfb 启用DirectFB (Unix only)
-eglfs 启用EGLFS(Android and Windows)
-gbm 启用GBM后端
-kms 启用KMS后端
-linuxfb 启用Linux 帧缓冲
-mirclient 启用Mir 客户端
-xcb 启用X11支持,选择使用xcb-*库,可选包括system、qt、no
输入后端:
-libudev 启用udev支持
-evdev 启用evdev支持
-imf 启用IMF支持(QNX only)
-libinput 启用libinput库支持,触摸屏
-mtdev 启用mtdev支持, 多点触控
-tslib 启用tslib支持, tslib触摸屏驱动扩展
-xcb-xinput 启用Xinput2支持,多点触控支持,用于桌面
-xkbcommon 启用键位支持
图片格式:
-gif 启用GIF读取支持
-ico 启用ICO支持
-libpng 选择使用libpng方式,可选的有system/qt/no
-libjpeg 选择使用libjpeg方式,可选的有systm/qt/no
3.7.4 数据库选项
-sql-<driver> 使能SQl <driver>插件
-sqlite 选择sqlite3 方式,有system和qt的
3.8 3D选项 
-assimp 选择要使用的assimp 库[可选的是system/qt/no]
-qt3d-profile-jobs -qt3d-profile-gl 使能jobs 和OpenGL 规范
-qt3d-simd 选择SIMD支持的等级[可选的是no/sse2/avx2]
-qt3d-render 启用Qt3D渲染方面
-qt3d-input 启用QT3D输入方面
-qt3d-logic 启用QT3D逻辑方面
-qt3d-extras 启用QT3D额外方面
-qt3d-animation 启用QT3D动画方面
3.9 更多图片格式选项 
-jasper 启用JasPer 库来支持JPEG-2000
-mng 启用MNG的支持
-tiff 启用tiff的支持有system、qt、no的选择
-webp 启用WEBP的支持
3.10 多媒体选项

-pulseaudio 启用pluse音频支持
-alsa 启用ALSA(高级Linux声音架构)的支持
-no-gstreamer 不启用GStreamer的支持
-gstreamer [version] 启用GStreamer
-mediaplayer-backend <name> 选择多媒体后端
-evr 在DirectShow和WMF中启用EVR
3.11 Web引擎选项
4、写脚本用以生成Makefile
正点原子例子
./configure -prefix /home/alientek/qt-everywhere-src-5.12.9/arm-qt \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-c++std c++11 \
--rpath=no \
-pch \
-skip qt3d \
-skip qtactiveqt \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdoc \
-skip qtgamepad \
-skip qtlocation \
-skip qtmacextras \
-skip qtnetworkauth \
-skip qtpurchasing \
-skip qtremoteobjects \
-skip qtscript \
-skip qtscxml \
-skip qtsensors \
-skip qtspeech \
-skip qtsvg \
-skip qttools \
-skip qttranslations \
-skip qtwayland \
-skip qtwebengine \
-skip qtwebview \
-skip qtwinextras \
-skip qtx11extras \
-skip qtxmlpatterns \
-make libs \
-make examples \
-nomake tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
-no-openssl \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
-tslib \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-I/home/alientek/tslib-1.21/arm-tslib/include \
-L/home/alientek/tslib-1.21/arm-tslib/lib \
-recheck-all
解释说明:
部署目录是/home/alientek/qt-everywhere-src-5.12.9/arm-qt
开源版本
自动更新证书
编译成release版本
剥离release版本时不需要的符号
编译成动态链接库
板子目标平台是linux-arm-gnueabi-g++
优化qmake
c++标准是c++11
rpath=no
使用预编译头文件
构建不包括qt3d模块、qtcanvas3d模块、qtandroidextras模块....
将libs和examples加入构建清单
将tools和tests不加入构建清单
构建时加入gui模块及其依赖
构建时加入widgets模块及其依赖
构建Qt D-Bus且动态加载libdbus-1
glib选择no
iconv(3)选择no
libpcre2选择qt
zlib选择qt
不使用openssl
字库freetype选择qt
布局harfbuzz选择qt
不启用opengl
linux 帧缓冲显示
xcb多点触控选择no
启用tslib触摸驱动
png、jpeg库选择qt
sqlite选择qt
数据库插件选择sql-sqlite
好看tslib的头文件和库文件
丢弃所有缓冲配置测试
4.1 借鉴后修改自己的脚本
4.2 碰上的问题
4.2.1 Windows下的回车换行和Unix下的换行问题
在vim上粗看不出来,是因为vim会自动识别换行方式,提示用dos方式打开,就是换行是Windows下的换行,^M&。
Windows下的换行符是\r\n,dos下可以识别\n,linux/unix下的换行符是\n.
查看的方式:
1、vim打开提示[dos]方式
2、vim -b 二进制方式打开可见^M$
修改的方式
1、使用dos2unix命令
dos2unix file1 file2即可完成
2、vim打开,用ff=unix
5、编译+安装
make && sudo make install
5.1 编译中碰到的问题
Python not found. Building QtQml requires Python.
sudo apt install python3.8
sudo unlink /usr/bin/python
sudo ln -s /usr/bin/python3.8 /usr/bin/python注意:版本和路径必须对
6、移植Qt到现成文件系统
6.1 打包成tar.bz2格式拷贝如U盘
tar -jcf ./arm-qt.tar.bz2 arm-qt
将其拷贝到U盘中
6.2 挂载U盘到mnt,解压库文件到/usr/lib 目录
mount /dev/sda1 /mnt ##挂载
tar xf arm-qt.tar.bz2 -C /usr/lib ##解压
6.3 配置环境变量
编译/etc/profile,在文末添加环境变量
source /etc/profile #使能profile 生效