Qt 源码编译

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.

 解决方法参考 关于qt5.12.9含QML交叉编译移植(Building QtQml requires Python.)问题解决办法_Leehowuxi的博客-优快云博客_qml交叉编译在移植QT5.12.9源码时,编译源码后,进行make install ,但是出现了问题:Python not found.Building QtQml requires Python.意味着缺失或找不到python资源包解决办法:1.未装Python资源包;sudo apt install python3.82.资源包未获取到;找到资源包并放置在/usr/bin/python目录下which python3sudo cp -r /usr/binpython3 /usr/bin/pyhttps://blog.youkuaiyun.com/qq_42259389/article/details/118245070

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 生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值