官网参考:
Qt for Linux/X11 - Building from Source | Qt 5.15
源码下载:
Index of /archive/qt/5.15/5.15.0/submodules
这里使用的是各个模块单独编译,这样有助于摸清各个模块之间的依赖关系
工程配置Configure:
默认情况下,可以直接运行 ./configure ,如果想增加定制化需求,则需要自行指定参数:
============== 全局 install相关 ==============
-prefix <dir> 重定向make install 动作的路径
-extprefix <dir> 交叉编译相关
-hostprefix [dir] 交叉编译相关
-external-hosstbindir <path> 交叉编译相关
============== 子 install相关 ==============
-bindir <dir> 二进制文件的install 路径,默认是 prefix/bin
-headerdir <dir> 头文件install路径,默认是 prefix/include
-libdir <dir> lib文件install路径,默认是prefix/lib
-archdatadir <dir> 架构相关文件isntall路径,默认是prefix
-plugindir <dir> 插件install路径,默认是 archdatadir/plugins
-libexecdir <dir> 帮助文档程序(assistant)install路径,windows下默认是
archdatadir/bin,linux下默认是archdatadir/libexec
-importdir <dir> QML1 安装路径,默认archdatadir/imports
-qmldir <dir> QML2 安装路径,默认是archdatadir/qml
-datadir <dir> 架构无关文件install路径,默认是 prefix
-docdir <dir> 文档安装路径,默认是 datadir/doc
-translationdir <dir> 多语言相关安装路径,默认是 datadir/translations
-sysconfdir <dir> 一些配置信息,默认是 prefix/etc/xdg,没看到过
-examplesdir <dir> 例子,默认prefix/examples
-testsdir <dir> 测试用例,默认prefix/tests
-hostbindir <dir> 交叉编译相关,指定主机的bin目录,对应 -bindir,默认 hostprefix/bin
-hostlibdir <dir> 交叉编译相关,指定主机的lib目录,对应 -libdir,默认 hostprefix/lib
-hostdatadir <dir> 交叉编译相关,指定主机的data目录,对应 -datadir,默认hostprefix
============== configure 元语 ==============
-help,-h 帮助
-verbose,-v 输出详尽信息
-continue 当configure出现error时直接忽略从而继续执行
-redo 使用上一次configure的选项,如果本次指定了新选项,则这些新选项不会被保
存,也就是说再做 -redo的时候还是使用刚才的 configure 选项
-recheck [test,... ] ???
-recheck-all ???
-feature-<feature> 开启某个特性,具体的特性
-no-feature-<feature> 关闭某个特性,具体的特性
-list-features 罗列所有特性
-list-libraries 罗列所有可能用到的外部依赖库
============== 构建选项 ==============
-opensource 构建开源版本
-commercial 构建商业版本
-confirm-license 自动选择license
-release 构建release版
-debug 构建debug版
-debug-and-release 同时否建debug和release
-optimize-debug 优化调试信息(MSVC 和 clang 无效)
-optimize-size 对输出二进制文件进行尺寸优化,但是运行速度可能会慢一点
-optimize-tools 交叉编译相关,是否优化工具
-force-debug-info 为release创建符号文件
-separate-debug-info 把调试信息裁剪出来
-gdb-index gdb加速
-strip 为release版裁剪不必要的符号
-gc-binaries 编译时垃圾回收,不太需要关心,静态库会自动触发此选项
-force-asserts 开启Q_ASSERT,即使是构建release版本
-developer-build 编译链接Qt用作开发Qt自身
-shared 构建动态库
-static 构建静态库
-framework 仅Apple用,构建Qt framework bundles
-platform <target> 指定目标平台的mkspec,target是mkspec文件
-xplatform <target> 指定目标平台的mkspec,target是mkspec文件,用于交叉编译
-device <name> 交叉编译设备名
-device-option <key=value> 为mkspec增加指定选项,用于交叉编译
-appstore-compliant 应用发布相关
-qtnamespace <name> 把所有的Qt库都用此命名空间包裹,这样可以用来区分不同版
本,使用时如:Qt5::QString,MyQt::QString
-qtlibinfix <infix> 把所有的 libQt5*.so 重命名为 libQt5*<infix>.so
-qtlibinfix-plugins 是否按照-qtbinfix指定的 infix 值重命名 Qt 插件
-testcocoon ???
-gcov ???
-trace [backend] backend可以是etw(windows)或者lttng(linux),指定trace工具
-sanitize {address|thread|memory|fuzzer-no-link|undefined} 编译相关
-coverage {trace-pc-guard|source-based} 为sanitizer提供服务
-c++std <edition> 指定c++版本,可以是 c++2a、c++17、c++14、c++11
-sse2 使用sse2指令集
-sse3/-ssse3/-sse4.1/-sse4.2/-avx/-avx2/avx512 使用指定的指令集
-mips_dsp/-misp_dspr2 MISP相关
-qreal <type> 重定义 qreal 类型对应的实际类型
-R <string> 以libdir为参考路径,为Qt库指定一个运行时库搜索路径
-rpath 同上一个
-reduce-exports 减少到处符号数量
-reduce-relocations ???
-plugin-manifests 为plugins增加manifest,Windows Only
-static-runtime 使用静态runtime库,Windows Only
-pch 使用预编译头
-ltcg 使用 Link Time Code Generation
-linker [bfd,gold,lld] 使用 GNU ld,GNU gold 或者 LLVM/LLD 这些链接器,gcc only
-incredibuild-xge 使用IncrediBuild XGE,Windows Only
-ccache 使用ccache编译器缓存,Unix Only
-make-tool <tool> 使用指定tool编译qmake,默认是nmake , Windows Only
-mp 多处理器编译,Windows Only
-warnings-are-errors 把warnings当做error
-silent 减少编译提示
============== 构建环境 ==============
-sysroot <dir> 设置目标sysroot???
-gcc-sysroot ???
-pkg-config 使用pkg-config,Unix Only
-D <string> 额外的编译宏定义
-I <string> 额外的include路径
-L <string> 额外的库路径
-F <string> 额外的framework 路径,Apple Only
-sdk <sdk> Apple Only,不关心
-android-sdk path
-android-ndk path
-android-ndk-platform
-android-ndk-host
-android-abis
-android-style-assets
============== 组件选择 ==============
-skip <repo> 跳过源码路径下的某个文件夹,repo对应文件夹名,比如 -skip qtcharts则
qtchart便不会被编译到当前工程中。
-make <part> 指定编译哪个模块,part对应???,注意,如果使用这个选项,则所
有默认值都会被取消,也就是说我们必须一个个地指定要编译的模块,一
般不建议使用。
-nomake <part> 和-make互斥,和-skip什么区别????
-compile-examples 如果指定,则例子不会被编译,只会保留源码,这个选项一般会被指
定,从而提高编译速度,例子可以在用到的时候直接当工程打开。
-gui 编译GUI模块及其依赖模块
-widgets 编译widget模块及其依赖模块
-no-bus 不要编译D-Bus模块
-dbus-linked 编译D-Bus并把它链接到libdbus-1中
-dbus-runtime 编译D-Bus并动态加载libdbus-1,对比-dbus-linked
-accessibility 开启accessibility支持
============== Qt Core 相关 ==============
-doubleconversion 使用double conversion 库,不实用 sscanf_l 和 snprintf_l
-glib 开启Glib
-eventfd 开启eventfd支持,eventfd是linux环境下的事件机制
-inotify 开启inotify支持,inotify用来监控文件描述符
-iconv 开启iconv支持
-icu 开启ICU支持
-pcre 使用libpcre2
-pps 开启PPS支持
-zlib 使用zlib
-journald 使用journald支持
-syslog 使用syslog支持
-slog2 使用slog2支持
============== 网络相关 ==============
-ssl 开启SSL
-no-openssl 关闭OpenSSL
-openssl-linked 使用并链接到libssl
-openssl-runtime 使用并动态加载libssl
-schannel 使用Secure Channel
-securetransport 使用SecureTransport
-sctp 开启SCTP支持
-libproxy 使用libproxy
-system-proxies 使用系统网络代理
============== Gui 、printing、widget 相关选项 ==============
-cups 开启CUPS支持
-fontconfig 开启Fontconfig支持
-freetype select used freetype
-harfbuzz select used harfbuzz-ng
-gtk 开启GTK平台主题
-lgmon 开启lgmon支持
-no-opengl 关闭opengl支持
-opengl <api> 开启opengl支持,同时指定api类型,可选为 es2 、desktop、dynamic
-opengles3 使用OpenGL ES 3.x,代替ES 2.x
-egl 开启EGL支持
-angle 使用ANGLE作为OpenGL ES 2.0的底层实现
-combined-angle-lib 把libEGL和 libGLESv2 合并到 LibANGLE中
-qpa <name> 选择默认的QPA后台,比如xcb,cocoa,windows
-xcb-xlib 开启Xcb-Xlib
============== 平台底层支撑 ==============
-direct2d .......... Enable Direct2D support [auto] (Windows only)
-directfb .......... Enable DirectFB support [no] (Unix only)
-eglfs ............. Enable EGLFS support [auto; no on Android and Windows]
-gbm ............... Enable backends for GBM [auto] (Linux only)
-kms ............... Enable backends for KMS [auto] (Linux only)
-linuxfb ........... Enable Linux Framebuffer support [auto] (Linux only)
-xcb ............... Enable X11 support [auto] (Linux only)============== 输入底层支撑 ==============
-libudev............ Enable udev support [auto]
-evdev ............. Enable evdev support [auto]
-imf ............... Enable IMF support [auto] (QNX only)
-libinput .......... Enable libinput support [auto]
-mtdev ............. Enable mtdev support [auto]
-tslib ............. Enable tslib support [auto]
-bundled-xcb-xinput Use bundled XInput2 support [auto]
-xkbcommon ......... Enable key mapping support [auto]============== 图片格式 ==============
-gif ............... Enable reading support for GIF [auto]
-ico ............... Enable support for ICO [yes]
-libpng ............ Select used libpng [system/qt/no]
-libjpeg ........... Select used libjpeg [system/qt/no]============== 数据库选项 ==============
-sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
db2 ibase mysql oci odbc psql sqlite2 sqlite tds
[all auto]
-sqlite .............. Select used sqlite3 [system/qt]
第三方库支撑:
Qt依赖很多第三方库,同时Qt的源码中也会包含这些库的源码,我们可以选择使用Qt自带的第三方库,或者选择使用自己指定的第三方库。
Library Name | Bundled in Qt | Installed in System |
zlib | | |
libjpeg | | |
libpng | | |
freetype | | |
PCRE | | |
HarfBuzz-NG | | |
注意,也可以指定某些库使用qt自带的,某些库使用系统的。比如:
./configure -no-zlib -qt-libjpeg -qt-libpng -system-xcb
如果没有特殊定制,可以考虑使用Qt源码中自带的库。
编译选项:
前面的 configure 选项中提到了 -platform 选项,这是用来指定目标平台的,不同的Qt版本也对于最低的操作系统版本也有要求,同样对于编译器也有要求。
Supported Platforms | Qt 5.15
在源码中的体现是,不同的platform有自己专属的 mkspec 文件,文件路径为 qtbase/mkspecs,当通过 -platform 指定某个平台时,configure就会加载对应的 spec 文件。
例如:
./configure -platform linux-clang # linux-clang为 qtbase/mkspecs目录下的一个目录名 ./configure -platform linux-g++ # linux-g++为 qtbase/mkspecs目录下的一个目录名 ./configure -platform linux-g++-32
可见,不仅区别 操作系统 及 位数,还会区别编译器。
交叉编译:
参考:Qt Configure Options | Qt 5.15
Windows平台下的OpenGL选项:
参考:Qt Configure Options | Qt 5.15
开发者模式:
使用 -developer-build开启开发者模式,开发者模式编译出来的工程包含最完整的符号信息和最全的告警提示。
重新配置:
configure脚本会在当前执行命令的目录下形成MakeFile 和 配置缓存,注意不是在configure文件所在目录,所以如果想要配置多个版本的构建策略,只需要创建多个目录,然后在各个目录下跨目录运行configure脚本即可。如果想要修改当前配置,则需要先运行make confclean 然后再进行configure。
构建Qt 文档:
Qt帮助文档要单独构建,再Makefile所在目录下运行:
make docs