0. 环境要求
1 建议先按需关闭麒麟操作系统的相关保护功能《麒麟V10关闭安全控制》
2 编译环境要求:
- 可用于编译的物理内存 + SWAP交换区 > 40GB,同条件下,物理内存越大,编译速度越快
- 可用于编译的磁盘空间 >160GB
- 建议CPU核心数据 >8核
1. 添加其他软件源
麒麟V10-SP1-HWE-2303-x86_64(兆芯)版本操作系统(简述为麒麟操作系统)为基于Ubuntu 18.04(bionic)发行版改进,该版本麒麟操作系统可以使用Ubuntu 18.04(bionic)及同内核版本的其他linux软件源。Qt 6.5.3 LTS开放源代码编译所需的部分组件在麒麟官方的软件源中不存在或版本过低,如gcc、g++、cmake等,故首先为麒麟操作系统添加其他可用的软件源。
1.1 安装apt tools
首先安装software-properties-common以便添加源时加入对应源的公钥。
sudo apt-get install -y software-properties-common
1.2 添加其他源到apt
此处添加阿里云和PPA到源列表。
请注意,麒麟操作系统默认源会被操作系统定时检测及还原,故请勿在默认源文件(/etc/apt/source.list)中增加其他源配置。而应在/etc/apt/source.list.d路径下为每个源单独配置一份配置文件。
# 添加阿里云 Ubuntu 18.04(bionic)源
FILE_SOURCE_LIST=/etc/apt/sources.list.d/aliyun.list
echo deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse > ${FILE_SOURCE_LIST}
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse >> ${FILE_SOURCE_LIST}
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse >> ${FILE_SOURCE_LIST}
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse >> ${FILE_SOURCE_LIST}
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse >> ${FILE_SOURCE_LIST}
# 添加PPA
FILE_SOURCE_LIST=/etc/apt/sources.list.d/ubuntu-toolchain-r-test.list
echo deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu bionic main >> ${FILE_SOURCE_LIST}
# 添加PPA公钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1E9377A2BA9EF27F
完成源配置的添加后,更新apt
sudo apt-get update
sudo apt-get upgrade
2. 安装编译环境
请注意,若执行某条安装命令失败,请在安装失败后先对apt进行缓存更新,然后尝试重新执行安装命令。若此时依然不行,则核对安装的包名是否正确或安装以对应组件库名打头的所有包。
2.1 前期使用的环境
使用高版本的gcc、g++、cmake、openssl需要先安装系统版本默认支持的版本作为基础版本,然后再进行高版本的安装或利用基础版本对高版本的源码进行编译安装以达到使用高版本的目的。
2.2 安装基础编译环境
2.2.1 安装gcc(9.x)、g++(9.x)、cmake
sudo apt-get install -y gcc g++ cmake
2.2.2 安装openssl 2.x
sudo apt-get install -y \
libssl-dev \
libgcrypt20-dev \
libcrypto++6 \
libcrypto++-dev \
openssl
2.2.3 安装clang-12、llvm-12
sudo apt-get install -y llvm-10 clang-10 llvm-10-dev libclang-10-dev
#变更为clang-12、llvm-12
sudo apt-get install -y llvm-12 clang-12 llvm-12-dev libclang-12-dev
#若第一次执行安装clang-12版本失败,则先对apt进行更新
2.3 安装高版本编译环境
2.3.1 安装gcc-13和g++-13
请注意安装前提:需先安装clang-12和llvm-12。
# 安装gcc-13
sudo apt-get install -y gcc-13
# 修改默认的gcc版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 60
# 检查安装及修改默认版本后的gcc版本号
gcc --version
# 安装g++-13
sudo apt-get install -y g++-13
# 修改默认g++版本
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 60
# 检查版本
g++ --version
请注意,若在多次通过update-alternatives修改默认gcc和g++无法生效,请使用update-alternatives --config来手动确认选择的版本。
# 输入下述命令后,按提示信息选择列出的gcc编译器序号
sudo update-alternatives --config gcc
# 输入下述命令后,按提示信息选择列出的g++编译器序号
sudo update-alternatives --config g++
2.3.2 安装OpenSSL 3.x
- 在ftp://192.168.0.61:50000/devenv/qtools/src,用户名: shared, 密码: 7474741获取openssl-3.3.0.tar.gz源码包openssl-3.3.0.tar.gz。
请注意需要编译安装debug和release两个版本,并且请勿将两个版本安装在同一路径下
#在openssl 3.x源码目录下执行命令 编译release版本并安装到默认目录
mkdir build-release && cd build-release
../config
#使用默认安装路径即可
make && make install
#在openssl 3.x源码目录下执行命令 编译debug版本并安装到 /usr/local/lib64d/openssl目录
mkdir build-debug && cd build-debug
../Configure --prefix=/usr/local/lib64d/openssl --debug
make && make install
# 请注意,此处仅是编译并安装到了系统中,不论是通过apt包安装的openssl还是自行编译安装的openssl,都没有自动建立ldconfig缓存,需要手动添加才能正常使用
2.3.3 安装CMake 3.29.x
- 在ftp://192.168.0.61:50000/devenv/qtools/src,用户名: shared, 密码: 7474741获取CMake 3.29.3源码包cmake-3.29.3.tar.gz。
- 解压缩cmake-3.29.3.tar.gz,并进入解压缩后的源码目录
执行如下命令进行编译、安装及版本检查
# 在解压缩后的cmake 3.29.x源码目录下执行 ./bootstrap # 编译 make # 安装 make install # 版本检测(检测安装结果) cmake --version
2.3.4 安装Node.js 20.x
执行以下命令以安装Node.js 20.x。
# 若需更新版本可通过打开链接获取最新的指令:https://deb.nodesource.com/
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt-get install -y nodejs
2.3.5 安装调试器GDB
当前使用源中最高版本10.x,若需要使用13.x或14.x请使用源码编译安装。
apt-get install -y gdb
3. 安装其他组件
安装编译Qt源码所需的其他环境(为方便执行指令,将存在安装失败可能的包安装指令拆分为单独一条)。
# 安装perl git ninja
sudo apt-get install -y perl git ninja-build
# 安装python3、python html5lib
sudo apt-get install -y python3 python-is-python3 python3-pip python3-pexpect
# Qt启用WebEngine则必须html5lib
pip install html5lib
# 安装enssential nss3
sudo apt-get install -y build-essential libnss3 libnss3-dev
# 更新pthread和动态加载相关的库,也可以通过升级libc的方式来升级
sudo apt-get install -y libpthread*
sudo apt-get install -y ldd
# Qt开启WebEngine组件必须
sudo apt-get install -y gperf bison flex ruby
# Qt开启WebEngine组件必须安装xcb和x11系列组件
#【请注意】必须先安装xcb-protocol组件,否则将导致部分xcb组件库安装失败
sudo apt-get install -y xcb-proto
# 先全系安装libxcb和libx11打头的库
sudo apt-get install -y libxcb*
sudo apt-get install -y libx11*
# proxy, 若安装失败,则先进行apt-get update,然后再尝试
sudo apt-get install -y libproxy1v5 libproxy-dev
# update后仍然不行,则安装libproxy打头的所有库
#sudo apt-get install -y libproxy*
# GSSAPI,若安装失败,则先进行apt-get update,然后再尝试
sudo apt-get install -y libgssapi-krb5-2 libgssapi-krb5-dev
# update后仍然不行,则安装libgssapi打头的所有库
#sudo apt-get install -y libgssapi*
# 安装directFB
sudo apt-get install -y directfb*
# 安装vulkan
sudo apt-get install -y libvulkan*
# 安装harfBuzz,若安装失败,则进行apt-get update,然后再尝试
sudo apt-get install -y libharfbuzz-dev
# update后仍然不行,则安装libharfbuzz打头的所有库
#sudo apt-get install -y libharfbuzz*
# 安装strp
sudo apt-get install -y libsrtp*
# 安装libatspi2
sudo apt-get install -y libatspi2.0-dev
# 安装蓝牙库
sudo apt-get install -y libbluetooth-dev
# 安装ICU
sudo apt-get install -y libicu-dev
#【非必须】Jasper需要手动通过包进行安装,仅ARM需要
#sudo apt-get install -y libjasper-dev
#-jasper arm only
#sudo apt install libassimp-dev depend on jasper
#sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
#-gstreamer -gstreamer-no-multimonitor -I/usr/include/gstreamer-1.0 -L/usr/lib/x86_64-linux-gnu -lgstreamer-1.0
#PKG_CONFIG="/usr/bin/pkg-config" PKG_CONFIG_PATH="/path/to/your/gstreamer/pkgconfig/files"
# 安装llTTNG,【请务必保证指令中的包顺序,否则将无法安装】
# 包安装顺序可参考 https://lttng.org 在debian类系统上安装的指导手册
sudo apt-get install -y lttng-modules-dkms liblttng-ust-dev lttng-tools
# 批量安装以下组件
sudo apt-get install -y libcups2-dev \
libcap-dev \
libdrm-dev \
libfontconfig1-dev \
libfreetype6-dev \
freeglut3-dev \
dbus \
libdbus-1-dev \
libdbus-glib-1-dev \
libudev-dev \
libudev1 \
libpci-dev \
libasound2-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libbz2-dev \
libb2-dev \
libatkmm-1.6-dev \
libinput-dev \
zstd \
libzstd-dev \
libsystemd-dev \
libgbm-dev \
libjpeg-dev \
libmd4c-dev \
libmtdev-dev \
libwayland-dev \
libsm6 \
libsm-dev \
libice6 \
libice-dev \
libdouble-conversion-dev \
libpq-dev \
libsqlite3-dev \
libgtk-3-dev \
libwebp-dev \
libmng-dev \
libmng2 \
gyp \
libjsoncpp-dev \
libopus-dev \
libminizip-dev \
libavutil-dev \
libavformat-dev \
libavcodec-dev \
libevent-dev \
libvpx-dev \
libsnappy-dev \
libre2-dev \
libprotobuf-dev \
protobuf-compiler \
libgssglue-dev \
libtiff-dev \
gawk \
wget \
diffstat \
texinfo \
chrpath \
socat \
cpio \
xz-utils \
debianutils \
iputils-ping \
liblz4-tool \
file \
locales
# 安装OpenGL 2.x
sudo apt-get install -y \
mesa-common-dev \
libegl1-mesa-dev \
libopengl-dev \
libgl1-mesa-dev \
libglu1-mesa-dev \
libglfw3-dev \
libgles2-mesa-dev \
libglib2.0-0 \
libglib2.0-dev \
libegl1-mesa \
libsdl1.2-dev
# 按组件名安装所必须的xcb组件,避免部分组件在批量安装时未安装
sudo apt-get install -y \
libxcb1-dev \
libxcb-glx0-dev \
libxcb-icccm4-dev \
libxcb-image0-dev \
libxcb-keysyms1-dev \
libxcb-randr0-dev \
libxcb-render0-dev \
libxcb-render-util0-dev \
libxcb-shape0-dev \
libxcb-shm0-dev \
libxcb-sync-dev \
libxcb-util-dev \
libxcb-util0-dev \
libxcb-xfixes0-dev \
libxcb-xinerama0-dev \
libxcb-xkb-dev \
libxcb-imdkit0 \
libxcb-imdkit-dev \
libxcb-composite0-dev \
libxcb-composite0 \
libxcb-cursor0 \
libxcb-cursor-dev \
libxcb-damage0 \
libxcb-damage0-dev \
libxcb-doc \
libxcb-dpms0 \
libxcb-dpms0-dev \
libxcb-dri2-0-dev \
libxcb-dri3-dev \
libxcb-ewmh2 \
libxcb-ewmh-dev \
libxcb-glx0-dev \
libxcb-present-dev \
libxcb-record0 \
libxcb-record0-dev \
libxcb-res0-dev \
libxcb-screensaver0 \
libxcb-screensaver0-dev \
libxcb-xf86dri0 \
libxcb-xf86dri0-dev \
libxcb-xinput-dev \
libxcb-xrm0 \
libxcb-xrm-dev \
libxcb-xtest0 \
libxcb-xtest0-dev \
libxcb-xv0-dev \
libxcb-xvmc0 \
libxcb-xvmc0-dev
# 按组件名安装所必须的x11组件,避免部分组件在批量安装时未安装
sudo apt-get install -y \
libgstreamer1.0-dev \
libhunspell-dev \
libpulse-dev \
libts-dev \
libxtst-dev \
libxslt-dev \
libxslt1-dev \
libxss-dev \
libx11-dev \
libx11-xcb-dev
libxcomposite-dev \
libxcursor-dev \
libxdamage-dev \
libxdamage1 \
libxext-dev \
libxfixes-dev \
libxi-dev \
libxkbcommon-doc \
libxkbcommon-dev \
libxkbcommon-x11-dev \
libxkbcommon-tools \
libxkbfile-dev \
libxrandr-dev \
libxrender-dev \
libxshmfence-dev \
libxshmfence1 \
libx11-doc \
libx11-freedesktop-desktopentry-perl \
libx11-guitest-perl \
libx11-keyboard-perl \
libx11-protocol-other-perl \
libx11-windowhierarchy-perl \
libx11-xcb-perl\
libxine2-bin \
libxine2-dev \
libxine2-ffmpeg \
libxine2-misc-plugins \
libxine2-plugins \
libxproto-dev
4.1 开启额外选项需要安装的依赖组件
- SCTP
sudo apt-get install -y libsctp-dev
- GSSAPI
sudo apt-get install -y krb5-user krb5-config libkrb5-dev
brotli
sudo apt-get install -y brotli libbrotli-dev
HiRes wheel support
请注意,此组件安装后未能成功在配置过程中启用,此处仅记录作为后续解决问题的参考sudo apt-get install - y libinput10 libhidapi-dev
directfb
sudo apt-get install -y libjpeg-dev libpng-dev libfreetype6-dev libfusion-dev libdirect-dev libdirectfb-dev
mysql
sudo apt-get install -y libmysqlclient-dev
ffmpeg
sudo apt-get install -y libavcodec-dev libavformat-dev libavutil-dev libswscale-dev
5 编译&安装
- 在源码目录下创建build-debug用于配置和安装debug版本
- 在源码目录下创建build-release用于配置和安装release版本
- 以配置release版本为例
请注意, 配置编译时启用的组件越多,编译占用内存和交换区越大,耗时越长。
# 设置QT插件调试,以便配置、编译过程输出详细错误信息
export QT_DEBUG_PLUGINS=1
# 配置编译
# 进入build-debug目录进行配置,release则进入build-release目录
../configure -DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_STANDARD_REQUIRED=ON \
-xcb -xcb-xlib -bundled-xcb-xinput -xkbcommon \
-fontconfig \
-sm \
-glib \
-opengl es2 \
-release \
-opensource -confirm-license \
-prefix ${PWD}/install \
-nomake tests \
-libproxy \
-sctp \
-libinput \
-sql-mysql \
-icu \
-openssl-linked -I/usr/local/include -I/usr/include -L/usr/local/lib64 -L/usr/lib/x86_64-linux-gnu -openssl-runtime \
-webengine-proprietary-codecs -webengine-developer-build -webengine-ffmpeg \
-make examples \
-force-debug-info \
-separate-debug-info \
-skip qtopcua
# 配置选项说明
# -DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_STANDARD_REQUIRED=ON, 指示使用CXX20标准
# -xcb -xcb-xlib -bundled-xcb-xinput -xkbcommon 此系列选项表示使用系统环境安装的xcb和x11组件;否则将自动检测,而自动检测下大概率会失败
# -fontconfig 表示使用系统安装的fontconfig库,否则将自动检测
# -sm 表示使用系统安装的libsm版本,否则将自动检测。在自动检测下,即使安装了满足要求的版本也无法找到SM
# -glib 表示使用系统安装的glib版本
# -opengl es2 表示使用系统安装的opengl版本库, es2表示启用ES2.0
# -release 表示编译release版本,-debug则表示编译debug版本。
# 请勿使用-debug-and-release而企图同时编译debug和release版本,该选项下不会生成完整的debug版本!
# 并且官方文档明确说明-debug-and-release仅适用于Windows平台编译,虽然在linux指定了也可以进行编译。
#
# -prefix ${PWD}/install 用于指定安装路径,此处${PWD}/install表示为当前路径下的install目录
# -opensource -confirm-license 表示确认使开源协议
# -nomake tests 表示不编译tests内容
#
# -openssl-linked -I/usr/local/include -I/usr/include -L/usr/local/lib64 -L/usr/lib/x86_64-linux-gnu -openssl-runtime,用于指定安装的OpenSSL 3.x以开启OpenSS 3
# 1. 请注意,本选项中-I指定的头文件路径和-L指定的库文件路径需要根据当前的目标编译版本debug或release,修改为对应debug或release的安装路径
# 2. 同时,需要在/etc/ld.so.conf中添加当前将要使用的编译安装的OpenSSL 3.x的debug或release动态库路径,然后执行ldconfig更新ld缓存再进行编译
#
# -libproxy 表示使用系统安装的proxy,并开启编译选项
# -sctp 表示使用系统安装的SCTP,并开启编译选项
# -libinput 表示使用系统安装的input
# -sql-mysql 表示使用系统安装的MySql并启用编译选项
# -icu 表示使用系统安装的ICU库
# -webengine-proprietary-codecs -webengine-developer-build -webengine-ffmpeg,表示启用WebEngine的codecs、developer、ffmpeg
#
# -make examples 表示编译示例项目
#
# -force-debug-info 标识强制为release生成debug信息
# -separate-debug-info 将调试信息单独生成存储
#
# -skip qtopcua 表示不编译qtopcua组件。当前由于启用OpenSSL 3.x导致无法检测到OpenSSL 1.1 和2.x,编译qtopcua依赖的open62541时将无法找到部分openssl的定义,故不进行qtopcua的编译
# 若需要编译qtopcua组件,可以在完成Qt编码编译后再单独使用OpenSSL 1.1和2.x进行编译
# 也可以自行下载支持OpenSSL 3.x的open62541 1.4版本,并在configure时指定open62541的安装信息,如“-DINPUT_open62541=system -DOPEN62541_INCDIR=/usr/local/include/open62541 -DOPEN62541_LIBDIR=/usr/local/lib”
请注意, 若在配置中提示xcb和x11部分组件检测不到,请尝试重新单独安装所报错的组件,即使前序步骤已经成功安装了它们。如:
- sudo apt-get install -y libxcomposite-dev
- sudo apt-get install -y libxcursor-dev
- sudo apt-get install -y libxrandr-dev
- sudo apt-get install -y libxi-dev
- sudo apt-get install -y libxproto-dev
- sudo apt-get install -y libxshmfence-dev
- sudo apt-get install -y libxtst-dev
- 建议每次配置时删除前一次的配置(即build-debug或build-release目录)再重新进行配置
- 编译和安装
# 编译,未指定核心数量时由工具链自行调度
# 可根据编译环境条件在 --parallel后显式指定用于编译的CPU核心数量,如
# cmake --build . --parallel 12
cmake --build . --parallel
# 安装,将安装在配置时的-prefix指定的路径下
cmake --install .
编译Qt帮助文档
完成和编译源码时一致的配置编译操作后,在build-*目录下执行:# 仅编译docs ninja docs # 编译完成后安装docs ninja install_docs
6. Qt源码编译中的坑
6.1 Qt6.5.3源码中的编码错误
6.1.1 编译过程中部分文件报错uint32_t不是std中的符号
如qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp文件
问题原因:该文件引用的是c规范的头文件stdint.h而非c++规范的cstdint,导致类型std::uint32_t不属于std命名空间
解决版本:修改源码中的#include <stdint.h>为#include
6.1.2 open62541找不到OpenSSL EVxxx定义
该问题目前尚未解决,可采取以下方法:
1. 使用-skip qtopcua的方式跳过open62541的编译
2. 可以使用自行编译的支持OpenSSL 3.x的open62541 v1.4版本,并以指定系统安装版本的方式跳过Qt自带的open62541版本的编译(待验证)
3. 不使用OpenSSL 3.x而使用OpenSSL 1.1和2.x进而不会因为版本引起问题(待验证)
编译open62541请参照如下方法:
# 下载open62541 源码, 如1.4的
#使用指定openssl库路径去编译open62541
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
export CMAKE_PREFIX_PATH=/usr/local/include:$CMAKE_PREFIX_PATH
# 创建一个编译目录build在其下进行配置、编译
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DUA_ENABLE_ENCRYPTION=ON -DUA_ENABLE_ENCRYPTION_OPENSSL=ON ..
make
make install