本文主要介绍如何通过 QT 源码, 构建 QT
交叉编译库,并利用该库编译一个简单的 demo
构建脚本如下:
build.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #!/bin/bash
function download() { wget -c http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz tar -xf qt-everywhere-src-5.15.2.tar.xz }
function build() { if [ ! -d "qt-everywhere-src-5.15.2" ]; then download fi
outdir=$PWD/out_qtbase cd qt-everywhere-src-5.15.2
./configure \ -prefix $outdir \ -xplatform linux-aarch64-gnu-g++ \ -opensource \ -confirm-license \ -no-opengl \ -no-vulkan \ -no-compile-examples \ -recheck-all
make module-qtbase -j8 make module-qtbase-install_subtargets }
build
|
首先 QT 源码编排是这样的:
在源码根目录有很多的文件夹, 每个文件夹对应于一个 qt 模块,
所有模块都需要依赖 qtbase 模块, 因为里面包含 qmake 构建工具, 同时qtbase
也是 QT 的核心, 里面包含 QT 的底层逻辑, UI
内核等。所以我们首先就是要构建 qtbase。
后续有需要再按需构建, 当然如果直接 make -j8 便是全部构建了, 会比较慢,
这里只构建一个 qtbase 写些简单程序足够了.
提示: make module- 后补全可以列出所有目标模块
配置信息
下面是配置信息, 可通过 ./configure --help
查看选项,
按需配置即可, 本文的配置内容如下, 其他没配置的就按默认。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| -prefix 指明了编译后输出路径 -xplatform 指出交叉编译时的使用的目标 mkspec, mkspec 是 qt 内置的用于多平台的配置文件, 位于 qtbase/mkspecs 文件夹下, 每个 mkspec 是一个文件夹 里面包含 qmake.conf, 描述编译时应当选择什么编译器以及配置, 这里我们希望编译生成的库文件适用于 aarch64 的 linux 平台, 刚好对应于 linux-aarch64-gnu-g++, 然后看里面的配置信息符合要求也不用改了。
值得注意的是 -xplatform 和 -prefix 配置信息将被硬编码至 qmake 程序里面的
-opensource -confirm-license 必须要同意 QT 的开源协议 -no-opengl -no-vulkan 不使用 opengl 和 vulkan, 不知为了这个版本必须 -no-vulkan,否则编译在代码上就出错 -no-compile-examples 为了加快速度, 不编译示例程序, 但 make install 时, 示例代码是被一同复制到库目录的,所以后面想看哪个示例再单独进行编译即可 -recheck-all 每次执行都重新检查一下配置并测试, 也就说说丢弃所有之前缓存的配置测试的结果
|
测试程序
编译完成后 qt 库将输出到 ./build.sh 所在目录下的 out_qtbase,
现在即可编写一个简单的 demo 测试一下
main.cpp
1 2 3 4 5 6 7 8 9 10 11 12
| #include <QApplication> #include <QLabel>
int main(int argc, char *argv[]) { QApplication a(argc, argv); QLabel *label = new QLabel("Hello, world!"); label->show(); return a.exec(); }
|
demo.pro
1 2 3
| QT += core gui widgets TARGET = qtdemo SOURCES += main.cpp
|
执行时使用生成的 qmake 来执行
1 2
| ../out_qtbase/bin/qmake make
|
通过 ../out_qtbase/bin/qmake -query
可以看到被硬编码到
qmake 中的路径信息和 mkspec 信息
参考
源文件来自于