首先下载Qt 5.15.3 源码
请前往Qt官方下载源码包, 官方版本QWebEngine只能在20.04编译成功
若启用QWebEngine,请从KDE获取修复版本以在22、24等Ubuntu进行编译
拉取 KDE 的 Qt5 补丁源(重点)
不要用 Qt 官方 5.15.3 源码,必须换 KDE 的。
git clone https://invent.kde.org/qt/qt/qt5.git -b kde/5.15
cd qt5
# 全量
./init-repository
# 查看子模块状态,前带‘-’ 表示缺失
git submodule status
# 因为网络原因可能部分模块拉取会失败,此时反复执行
./init-repository -f
# 或
git submodule update --init --recursive
# 直至没有任何子模块前带 -
# 仅拉取可指定子模块
./init-repository --module-subset=qtwebengine
# 切换至目标版本(tag)
git tag | grep 5.15
# 切换至5.15.3
git checkout v5.15.3-lts-lgpl
# 切换子模块
git submodule foreach 'git fetch --tags'
git submodule foreach 'git checkout v5.15.3-lts-lgpl || echo "No tag v5.15.3-lts-lgpl for $name"'
编译构建环境
先完成编译、构建环境的安装,然后再进行Qt的编译。
安装基础构建工具
sudo apt-get install -y build-essential perl python3 git ninja-build flex bison gperf pkg-config安装X11、XCB全家桶依赖
sudo apt-get install -y \
libxcb1 libxcb1-dev \
libxcb-util1 libxcb-util-dev \
libxcb-keysyms1 libxcb-keysyms1-dev \
libxcb-image0 libxcb-image0-dev \
libxcb-icccm4 libxcb-icccm4-dev \
libxcb-render-util0 libxcb-render-util0-dev \
libxcb-xinerama0 libxcb-xinerama0-dev \
libxcb-cursor0 libxcb-cursor-dev \
libxcb-xkb1 libxcb-xkb-dev \
libxkbcommon-dev libxkbcommon-x11-dev \
libx11-dev \
libxext-dev \
libxrender-dev libxrandr-dev libxss-dev \
libxi-dev \
libx11-xcb-dev \
libxext-dev libxfixes-dev libxi-dev \
libxrender-dev libxrandr-dev libxtst-dev libxss-dev \
libxcb-xfixes0-dev \
libxcb-util0-dev \
libxcb-shape0-dev \
libxcb-shm0-dev \
libxcb-sync-dev \
libxcb-randr0-dev \
libudev-dev libevdev-dev安装图形、字体、Image格式依赖
sudo apt-get install -y \
libfontconfig1-dev \
libfreetype-dev \
libpng-dev \
libjpeg-dev \
libglib2.0-dev \
libdbus-1-dev \
libicu-dev \
libssl-dev \
mesa-common-dev \
libglu1-mesa-dev \
libgtk2.0-dev \
libgtk-3-dev \
zlib1g-dev \
libharfbuzz-dev蓝牙
sudo apt-get install -y libdbus-1-dev libbluetooth-dev串口
sudo apt-get install -y libserialport-devWebSockets
sudo apt-get install -y libwebsockets-devpositioning
sudo apt-get install -y libgps-dev gpsd
sudo apt-get install -y qtbase5-private-dev
sudo apt-get install -y libqt5positioning5-devqtlocation依赖于clip2tri、poly2tri、clipper
- 在qtlocation/src/3rdparty下逐一编译源码
- 安装sudo add-apt-repository universe
sudo apt update
apt install libclipper-dev libpoly2tri-dev - 若安装不了
下载源码:
clip2tri:从Qt源码获取(路径通常为qtlocation/src/3rdparty/clip2tri)。
poly2tri:从GitHub克隆:
bash
git clonehttps://github.com/r3mi/poly2tri.js.git # 或查找C++版本
clipper:从官网下载:
bash
wgethttp://sourceforge.net/projects/polyclipping/files/clipper_6.4.2.zip
unzip clipper_6.4.2.zip
编译与安装:
clip2tri(以Qt源码内版本为例):
bash
cd qt-everywhere-src-5.15.3/qtlocation/src/3rdparty/clip2tri
qmake && make -j$(nproc) && sudo make install
poly2tri(C++版本):
bash
cd poly2tri/cpp
mkdir build && cd build
cmake .. && make -j$(nproc) && sudo make install
clipper:
bash
cd clipper_6.4.2/cpp
g++ -shared -fPIC -o libclipper.so clipper.cpp
sudo cp libclipper.so /usr/local/lib/
sudo cp clipper.hpp /usr/local/include/
验证安装:
bash
ls /usr/local/lib | grep -E "clipper|poly2tri"
如果修改了 poly2tri 源码,需重新编译 qtlocation 模块:
bash
cd qt-everywhere-src-5.15.3
make module-qtlocation -j$(nproc) # 仅编译qtlocation模块
或完全重新编译Qt
make -j$(nproc) && sudo make install
安装QDoc所需依赖
sudo apt-get install -y libclang-dev
# 查看LLVM的可执行程序路径
which llvm-config
llvm-config --version
# 将LLVM的可执行路径导出到环境变量PATH
# 根据实际路径调整
export PATH=/usr/lib/llvm-20/bin:$PATH
安装QWebEngine、QPdf、QDoc所需依赖 Python2
支持Python2的可以直接安装不用源码编译。
# 找个目录下载Python2的源码, 使用源码编译安装
cd ~/cache
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar xf Python-2.7.18.tgz
cd Python-2.7.18
./configure --prefix=$HOME/opt/python2
make -j$(nproc)
make install
# 将Python2的安装路径导出到PATH, 并设置PYTHON为python2
export PATH=$HOME/opt/python2/bin:$PATH
export PYTHON=python2安装OpenGL、Mesa
sudo apt-get install -y mesa-common-dev libglu1-mesa-dev libgl1-mesa-dev安装WebEngine(Chromium)编译依赖
sudo apt-get install -y \
libnss3-dev libatk1.0-dev libatk-bridge2.0-dev libcups2-dev \
libdrm-dev libgbm-dev libxcomposite-dev libxdamage-dev \
libxshmfence-dev libasound2-dev libpulse-dev \
nodejs python3-dev 安装其他模块用到的组件
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libqt5xmlpatterns5-dev qml-module-qt-labs-folderlistmodel内存问题
可选择内存足够的环境进行编译,或调大swap
# 创建一个16GB的SWAP
sudo swapoff -a
sudo fallocate -l 16G /swapfile
# 设置权限, 否则系统拒绝使用
sudo chmod 600 /swapfile
# 格式化为SWAP
sudo mkswap /swapfile
# 启用
sudo swapon /swapfile
# 检查是否生效
free -h
# 若希望重启操作系统后仍然生效,则编辑/etc/fstab
sudo nano /etc/fstab
# 加上这一行
/swapfile none swap sw 0 0
# 临时减少 Swap 使用频率(强烈建议):
sudo sysctl vm.swappiness=10
# 永久生效
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
编译
全量编译安装
release
mkdir build && cd build
# Linux不支持-debug-and-release,所以使用-release -force-debug-info
# 编译完relase后,再设置编译debug版本
../configure \
-opensource -confirm-license \
-prefix /home/lewis/opt/qt/qt/qt-5.15.3 \
-release -force-debug-info \
-nomake tests \
-nomake examples \
-skip qtandroidextras \
-skip qtdoc \
-skip qtwebengine \
-qt-zlib -qt-libpng -qt-libjpeg
#编译不过, 暂时屏蔽
#-webengine-proprietary-codecs \
#-feature-webengine-spellchecker \
make -j$(nproc)
make install
debug
# 不能使用同一个build目录
rm -rf build
mkdir build && cd build
# Linux不支持-debug-and-release,所以debug、release分开编译
# -preifx 指定与release相同的路径
../configure \
-opensource -confirm-license \
-prefix /home/lewis/opt/qt/qt/qt-5.15.3 \
-debug \
-nomake tests \
-nomake examples \
-skip qtandroidextras \
-skip qtdoc \
-skip qtwebengine \
-qt-zlib -qt-libpng -qt-libjpeg
make -j$(nproc)
make install