0%

在 Ubuntu 上搭建 Qt 开发环境

搭建 Qt 开发环境的几种方式:

  • Qt 官方下载页面 支持 ≤5.12.12 、x86 架构的离线安装包(Windows/Linux/Mac );
  • 比 5.12.12 更新只有在线安装包;Qt 目前已经支持 ARM 架构,但只有在线安装包;
  • Qt 从源码构建安装,费时费力还容易出错。我还没掌握
  • Qt 在 Linux 还可以通过各系统的软件仓库安装,版本陈旧,也需要联网

使用在线安装工具,默认只展示最新的三个 Qt 版本供用户安装。右侧筛选项,勾选 Archive 后筛选就会列出旧版本的 Qt 。

Ubuntu 20.04.1 LTS (Focal Fossa)

为什么选择这个版本的系统来学习?

公司业务线目前采用的 Kylin V10 桌面版。无论是含掉电保护模式的 HJ 版,还是“物美价廉”的 GF 版,大厦基石都一致:

Linux version 5.4.18 , gcc version 9.3.0

推断两者都是基于 Ubuntu 20.04 LTS ,改用 UKUI 桌面环境的换皮版。 所见略同

以下是不同的版本:联网安装时会自动更新 Linux 内核!! 查看内核版本 uname -a

  • ubuntu-20.04 ,发布于 2020-04-23, 在 2025-04 支持结束
  • ubuntu-20.04.1 ,Linux version 5.4.0 Ubuntu 旧版本
  • ubuntu-20.04.2 ,Linux version 5.8
  • ubuntu-20.04.6 ,Linux version 5.15.0

思考:公司产品都是采用 Arm 架构的飞腾主板,我只有 x86 的电脑。底层架构都不一致,争取 Linux kernel 一致性有没有必要?

Qt 5.12.8

在 ubuntu-20.04.1 系统中使用 qt-opensource-linux-x64-5.12.8.run 离线安装包时,勾选 Qt 库及其源代码,缺少 debug info 导致断点调试无法进入 Qt 源代码。

如果使用 online 安装包,可以同时勾选、下载 debug info 。但 online 安装包只支持 Qt5.15.1 、 Qt5.15.2 和 Qt6.x 。

调试信息需要另行下载:必须选择较新的 202004051456qtbase 包!我试过 202003131355qtbase 包,不成功。

Qt 打包的历史仓库中,并没有 arm 架构下 Qt5.x 的离线安装包、库文件、debug info 等。

Ubuntu下跟踪调试QT源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装开发工具,以及之后使用 QtCreator 依赖的库
sudo apt update
sudo apt install openssh-client openssh-server \
open-vm-tools open-vm-tools-desktop \
git build-essential vim \
libxcb-cursor-dev mesa-common-dev libglu1-mesa-dev libxcb-xinerama0

# 不要更新(避免更新 Linux kernal)
reboot
sudo ./qt-opensource-linux-x64-5.12.8.run # 9+qDuLth.F@MD#8
wget https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5128/qt.qt5.5128.debug_info.gcc_64/5.12.8-0-202004051456qtbase-Linux-RHEL_7_4-GCC-Linux-RHEL_7_4-X86_64-debug-symbols.7z
# 解压后,将 debug info 放到 Qt lib 路径下
sudo mv ./5.12.8/gcc_64/lib/*.debug /opt/Qt5.12.8/5.12.8/gcc_64/lib/
# 在 QtCreator 中进行源码路径映射
# 下载 demo 进行测试
export http_proxy='http://192.168.50.222:10811'
export https_proxy='http://192.168.50.222:10811'
git clone https://github.com/tnie/DayDayUp.git

QEMU 模拟器

在 amd64(3400g) + windows + qemu 上模拟 arm 架构安装 Kylin V10 ,延迟 10min+ 响应一次键盘事件。

摸索交叉编译试一试吧

软件仓库

系统环境:

1
2
3
4
5
6
7
niel@ubuntu:~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
niel@ubuntu:~$ uname -a
Linux ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

克隆仓库 需要较大的磁盘空间,下载过程也耗时比较久:

1
2
3
apt install apt-mirror
vim /etc/apt/mirror.list
apt-mirror

针对 Kylin-Desktop-V10-SP1-General-Release-2303-arm64 ,以最小配置为例,需要准备 120G 的硬盘空间备用:

1
2
3
4
5
6
7
8
9
10
11
############# config ##################
#
set base_path /media/niel/idle
set nthreads 4
set _tilde 0
#
############# end config ##############

deb-arm64 http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main restricted universe multiverse
deb-arm64 http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1-2303-updates main restricted universe multiverse

提供服务:仓库克隆下来之后,${base_path} 随便拷贝、移动使用,比如拿到另一台设备上提供服务

1
2
3
4
5
6
7
8
apt install nginx
# view /etc/nginx/sites-available/default
ln -s ${base_path}/mirror/archive.kylinos.cn/kylin /var/www/html/kylin
# view /etc/nginx/nginx.conf
chmod o+r ${base_path} # 确保拥有权限
chmod o+x ${base_path}
# todo 解决权限问题 google
systemctl restart nginx.service

访问 http://127.0.0.1/kylin/KYLIN-ALL/dists/10.1/Release 验证是否可用(是否解决权限问题)。

开发环境

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
35
36
37
38
# 改成能连接的、网速良好的镜像地址(或者内网中的镜像地址)
vim /etc/apt/sources.list
apt update
apt autoremove
apt --fix-broken install
apt-get autoclean
apt-get clean

apt install tcpdump tcpreplay wireshark
apt install iperf3
apt install dos2unix minicom gimp ssh
apt install unixodbc-dev
apt install cmake git build-essential
apt install gitk git-gui

apt install libxtst-dev # 或 apt install xorg-dev
apt install libgdk-pixbuf2.0-dev
apt install libnotify-dev

apt install libqt5charts5-dev
apt install libqt5serialport5-dev
apt install libqt5svg5-dev
apt install libqt5webkit5-dev

apt install qt5-default
apt install qtbase5-doc
apt install qtbase5-doc-dev qtbase5-doc-html
apt install qtbase5-examples qtbase5-private-dev
apt install qtcreator
apt install qtcreator-doc
apt install qtmultimedia5-dev
apt install qtpositioning5-dev
apt install qttools5-dev

apt list --installed | grep qt
# 不建议更新
# apt list --upgradable
# apt upgrade

自行下载:

  • typora 官网下载,解压直接使用。在桌面、开始菜单(/usr/share/applications/)中手动增加 .desktop 方便使用。
  • dm8 参考其安装手册,避免使用 root 用户安装。在常用账户(而非创建 dmdba 用户)下安装即可,方便使用客户端工具。
  • Qt 5.13.2 放在常用账户的主目录下,在 /opt 中创建软链接:部分模块对原始安装目录 /opt 存在硬编码。
  • Enclib 放在常用账户的主目录下,以便获取写权限。在 /opt 中创建软链接
  • QtPdfium 从 GitHub 仓库克隆源码,依据其 README 自行编译, make install 安装。

QtPdfium

此项目的代码量很小,通过 3、4 个类封装了 Pdfium 的使用。

在 arm 架构下需要打补丁:

1
2
3
4
5
6
7
# 追加到 fx_lpng.pri 文件中
contains(QMAKE_HOST.arch, aarch64) {
SOURCES += \
$$SOURCE_DIR/libpng16/arm/filter_neon.S \
$$SOURCE_DIR/libpng16/arm/filter_neon_intrinsics.c \
$$SOURCE_DIR/libpng16/arm/arm_init.c
}

项目的价值在于它把 Pdfium 打包成了 Qt module ,make install 安装到 $QTDIR 之后方便使用:

类比使用 Qt Xml 等模块,避免手工添加头文件、库的依赖。

学习它如何组织三方库 Pdfium 的代码

QtPdfium 以源码形式使用 Pdfium ,而非先将后者编译成库再次使用。

学习制作 Qt module 如何组织代码

load(qt_parts)load(qt_module) 特性做了什么?