写在前面
ubuntu交叉编译qt环境直接参考野火
5. 交叉编译Qt库(Qt6) — [野火]嵌入式Qt应用开发实战指南—基于LubanCat-RK开发板 文档
该贴仅留作失败记录。
我用的立创官方的ubuntu20.04_hdmi_20240220_RNDIS_update.img
烧录进开发板。
Ubuntu 登录界面初始化顺序
启动引导程序(GRUB):加载 Linux 内核。
内核启动:加载驱动程序,启动 systemd。
systemd 启动:根据配置文件启动显示管理器服务(如 GDM3)。
显示管理器启动:启动 X Server,加载图形环境,显示登录界面。
用户登录:用户输入用户名和密码后,启动用户会话。
整个过程由 GRUB → 内核 → systemd → 显示管理器 → 用户会话依次完成。
用户登录后
用户会话管理器:启动桌面环境的核心组件。
桌面环境:加载用户选择的桌面环境(如 GNOME、KDE 等)。
用户配置:恢复用户的个性化设置。
后台服务:启动用户会话所需的后台服务。
用户脚本:执行用户自定义的登录脚本。
常用指令
//查看内存大小
free -h//查看磁盘空间大小(emmc通常被识别为块设备,即磁盘空间)
df -h//基本挂载.把远程地址的data文件夹挂载到本地目录/mnt/nfs
mount -t nfs 192.168.1.10:/data /mnt/nfs//递归查找当前目录下的指定文件
find . -name "文件名"//查看软件路径
which 软件名//显示系统信息
uname -a//查看ubuntu系统版本.其实是看/etc/os-release
lsb_release -a
vim中搜索内容,
正常模式下 /hello 就是搜索hello然后按n查找下个匹配项,N查找上个匹配项
显示屏和触摸
免驱显示屏的触摸驱动具有通用性,
主要是因为:
标准化的通信接口(如 I2C、SPI);
分层的驱动程序架构,使得硬件抽象层可以适配多种硬件;
广泛使用的通用触摸屏芯片(如 FT5426、GT9147);
操作系统的内置支持,使得常见设备可以自动识别并加载驱动程序;
硬件设计的通用性,使得不同厂商的触摸屏在功能和接口上具有相似性。
要注意只有触屏没有按键,不会自动弹出虚拟键盘。
显示管理器
在Linux系统中,显示管理器是负责显示登录界面并管理用户会话的软件。
常见的显示管理器包括
LightDM、
GDM(GNOME Display Manager)、
SDDM(Simple Desktop Display Manager)等。
ubuntu内置了LightDM与GDM2两种显示管理器,具体用的哪一种需要根据配置文件查看。
//查看当前运行的显示管理器
systemctl get-default
如果输出类似于graphical.target,则表示系统处于图形界面模式。接下来,可以进一步确认显示管理器。
//查看当前系统的显示管理器服务
systemctl list-units --type=service | grep display-manager
不行的话直接看配置文件,
cat /etc/systemd/system/display-manager.service
我这里查配置文件,查到泰山派开发板ubuntu20.04的显示管理器是lightdm。
显示服务器协议
在聊显示管理器的时候,可能经常会看到wayland和x11,这是两种不同的显示服务器协议。wayland新,x11传统。
显示服务器协议用于窗口、图标、字体、颜色等东西的渲染,并负责图形相关硬件的兼容性和交互。
桌面环境
在linux的登录界面的右上角,可以手动选择桌面环境
Ubuntu:默认桌面环境,通常是 GNOME,适合大多数用户。
Ubuntu on Wayland:Ubuntu 桌面环境,使用 Wayland 协议。
Xfce Session:轻量级桌面环境,适合老旧或资源有限的系统。
Xubuntu Session:基于 Xfce,Ubuntu 官方变体,简洁且高效。
其实就是分别基于X11桌面服务器协议或者不同的桌面环境。
查看桌面环境的指令:
echo $XDG_CURRENT_DESKTOP
GNOME是常见的桌面环境。提供用户界面、窗口管理、文件管理、应用程序启动等功能。
我测试时使用的系统查看到的桌面环境得到的是XUbuntu,是基于
Xfce桌面环境的一个ubuntu轻量级发行版。
ubuntu自动登录(失败)
linux出于安全性考虑,默认是必须使用密码登录的。
//查看当前运行的显示管理器
systemctl get-default
DM2显示管理器
ubuntu系统如何设置启动时不要输入开机密码_ubuntu关闭开机密码-CSDN博客
修改/etc/gdm3/custom.conf配置文件。
LightDM显示管理器
Ubuntu跳过登录密码_ubuntu 开机不需要密码直接进去-CSDN博客
Ubuntu自动登录Xfce 设置指南:告别繁琐登录步骤 提升工作效率 - 云原生实践
如果上面集中免密登录桌面的方式不行的话,就看下一章节
关于登录权限
在linux中,即使用相同的用户名登录,所得到的权限可能不同。
这是由Linux的权限管理机制和用户组配置导致的。
//查看当前用户所属组
groups//查看权限掩码 如得到0002 每位代表 特殊/用户/组/其他 每位由二进制 读/写/执行 计算
//0002代表其他用户[不具有]写权限,即写权限被掩码掩盖
umask
我测试时,使用管理员账号在桌面打开设置,按照前面博客的图形化设置方式来改,发现没有权限去设置自动登录。
于是尝试直接用管理员权限打开设置,
sudo gnome-control-center //注意这里的指令是针对gnome桌面的
结果发现,设置自动登录是能设置了,
重启的时候确实是不用密码了,
但是一熄屏,还是需要登录密码。
ARM Linux跳过login_linux 开机跳过 login-CSDN博客
Ubuntu开机自动登录(成功)
有些文章说在设置里面改,我测试时用的系统是xubuntu,轻量版,设置里面连user栏都找不到。
这个是不适用图形界面时的,tty界面登录
Ubuntu开机自动登录_ubuntu 自动登录-CSDN博客
这个是使用界面时的,
https://wenku.csdn.net/answer/7wnv1pn7om
ubuntu系统如何设置启动时不要输入开机密码_ubuntu设置开机不需要密码-CSDN博客
稀奇古怪的,昨天明明试过上面文章的方法没成功,睡了一觉过来试了试又成功了.......
![](https://i-blog.csdnimg.cn/direct/d6ca34e07783417692fb4633f95968a4.png)
关于Seat的解释:
在多【座位】环境中,系统可以支持多个独立的用户同时使用不同的硬件设备。例如,一个系统可以连接多个显示器、键盘和鼠标,每个组合形成一个【座位】。
ubuntu跳过默认桌面显示,直接启动图形应用程序
ubuntu开机跳过输入密码登录和默认桌面显示,直接启动图形应用程序,替换默认图形桌面_ubuntu20 程序替换桌面-CSDN博客
远程连接ubuntu20.04系统开发板
2025.2.11测试失败,原因未知
用mobaxterm做ssh远程连接时没过几秒就自动断开,
win10的xrdp远程连接也失败了
参考
win10系统远程登录Ubantu桌面_win10连接ubuntu远程桌面-CSDN博客
在板子上安装xrdp,(一种RDP开源服务器),并设置该服务为开机自启。
可能存在登陆闪退问题
windows远程桌面登录ubuntu,黑屏闪退,_window 远程ubuntu闪退-CSDN博客
或者直接SSH远程连接。
2025.2.11 ,参考
立创泰山派学习04-ubuntu的VNC远程桌面 - zbl1118 - 博客园
VNC远程连接成功
软件盘
需求
现在需求是,开机后登录要输入密码,产品不接键盘只有个触摸屏。
如果只用软件盘,开机登录用户的时候软件盘不会自动弹出。
用系统不带密码,但是软件带密码的方式。
介绍
在Linux系统中,特别是在图形用户界面(GUI)环境下,通常不直接支持在登录界面(如GDM、LightDM等桌面环境的登录屏幕)弹出软键盘(虚拟键盘)。
这是因为登录界面通常设计为快速、安全的登录方式,不希望引入额外的输入设备(如软键盘)来降低安全性。
步骤和结果
ubuntu自带 onboard键盘,登陆界面右上角有个小人,点一下可以勾选开机自启动虚拟键盘。
没搞出来。
屏幕7寸,分辨率不够,键盘没正常显示。
导致
可以跳过开机的登录界面,但是不能息屏,因为息屏也会进入用户登录界面。
![](https://i-blog.csdnimg.cn/direct/b01ebb08cc0247ada2c5fd57f7142c36.jpeg)
杂问题
sudo apt install时出现 正在等待缓存锁,无法获得锁
通常是因为系统中另一个进程(如自动更新程序unattended-upgr)正在使用APT包管理器,导致锁文件被占用。
查看占用锁的进程ID,
ps aux | grep aptps:是“process status”的缩写,用于显示当前系统中运行的进程信息。
aux:是 ps 命令的一个选项组合,具体含义如下:a:显示所有终端上的进程,包括其他用户的进程。u:显示进程的用户(所有者)信息。x:显示没有控制终端的进程(例如后台运行的进程)grep aptgrep:是一个强大的文本搜索工具,用于在文件或输出中搜索匹配特定模式的行。apt:是 grep 的搜索模式,表示只显示包含字符串“apt”的行。
grep apt 的作用是从 ps aux 的输出中筛选出包含“apt”的行,从而找到与 apt 相关的进程
终止进程,
sudo kill -9 processnumber
//kill 是一个用于发送信号给进程的命令。
//默认情况下,kill 发送的是 SIGTERM(终止信号),允许进程优雅地关闭。
//然而,kill 也可以发送其他信号,具体取决于你使用的选项。
// -9
//作用:-9 是一个选项,表示发送 SIGKILL 信号给目标进程。
//SIGKILL 是一个强制终止信号,它不能被进程//捕获或忽略。
//这意味着进程将立即被终止,而不会有机会进行清理操作。
或者针对 无法获得锁 /var/lib/dpkg/lock-frontend”错误时 ,尝试 sudo apt update。
——————————————————————————————
下面是废稿,仅记录
QT6.xxx源码包的交叉编译
源码包定义
qt-everywhere-src-xxx 是一个源码包,而不是 SDK。它提供了 Qt 6.6.3 的全部源代码,用户需要自行编译生成库文件和工具。
源码包与SDK的关系:
源码包可以用于构建SDK:开发者可以从源码包开始,编译生成 SDK 中的库文件和工具。
SDK可以包含源码包:有些 SDK 会提供源码包作为可选组件,方便用户进行定制。
源码包交叉编译流程
QT官网可以直接下载源码包。
子模块支持单独下载、编译、安装。
single是整包的,可通过配置文件对子模块进行编译、安装。
参考:
单独编译QT子模块_qt单独编译某个模块-CSDN博客
How to Build, Install and Setting Qt Application/zh - FriendlyELEC WiKi
这里用整包举例,参考
将qt程序交叉编译到arm架构上用需要以前在arm架构上配置环境吗_香奈儿的技术博客_51CTO博客
防止网页丢失我打印了PDF放到博客文件上。
我在虚拟机ubuntu18.04.6版本上对源码包进行交叉编译。
解压
![](https://i-blog.csdnimg.cn/direct/c4e90c948b2e44f686b99501e347fe51.png)
![](https://i-blog.csdnimg.cn/direct/27659fff2d2e473c8dd2ac9f1921b8cf.png)
qtbase是QT的基础模块目录,
在源码目录和qtbase目录下,都有一个configure文件。
在Qt源码目录下执行:
./configure --help
会打印出帮助信息,在/qtbase目录下使用上述命令同样会打印帮助信息,只是在此处打印出的信息比在源码目录下使用confiigure --help
命令打印出的帮助信息少。
当我们在Qt源码目录下执行
./configure
命令时,可以配置整体编译方案,我们则可以在此处设置想要编译构建的参数和模块。在/qtbase目录下,执行
./configure
命令时,配置的是该目录下的Qt基本模块。
![](https://i-blog.csdnimg.cn/direct/9bcdd88feca94ed98f027e16b975a3b5.png)
qtbase/mkspecs目录下,存放的是跨平台时,与具体平台编译器集合的构建环境关联的目录。
![](https://i-blog.csdnimg.cn/direct/4dd9c79ea1ae475dad38ebbf975fe863.png)
且与架构相关联的目录中存放了两个文件:
![](https://i-blog.csdnimg.cn/direct/6b9b44aabfc04bc996a91d194bc96cc6.png)
qplatformdefs.h 是一个头文件,用于描述具体模块层级包含的相关头文件依赖。
修改 qmake.conf 文件
![](https://i-blog.csdnimg.cn/direct/8428df0a43ba4877bb2aff141e81636a.png)
在上述图片中,等号右边表示具体的编译构建工具名称。需要提前安装对应的编译套件且将他们添加到环境变量中(如果没有添加,可以以绝对路径来描述)。
编译构建qtbase
将终端切换到qtbase目录下。
按照上小节,修改qmake.conf文件中的编译器链名称与自己所用的相符。
在终端使用下列命令:
ninja版本
#!/bin/bash
# 指定使用的 shell 解释器为 bash# 定义安装前缀路径,确保是绝对路径
PREFIX=/home/a123/woniu/qt-everywhere-src-6.8.2/qtbase/install
# 设置软件安装的目录路径# 定义交叉编译平台
CROSS_PLATFORM="linux-aarch64-gnu-g++"
# 设置交叉编译的目标平台# 创建一个新的构建目录
mkdir -p build
cd build# 检查并安装 Ninja
if ! command -v ninja &> /dev/null; thensudo apt updatesudo apt install ninja-build
fi# 运行 configure 脚本
/opt/cmake-3.31.0-rc2-linux-x86_64/bin/cmake \-DQT_INTERNAL_CALLED_FROM_CONFIGURE:BOOL=TRUE \-DBUILD_SHARED_LIBS=ON \-DCMAKE_INSTALL_PREFIX="$PREFIX" \-DQT_QMAKE_TARGET_MKSPEC="$CROSS_PLATFORM" \-DCMAKE_BUILD_TYPE=Release \-DINPUT_opengl=no \-DINPUT_strip=yes \-DFEATURE_system_sqlite=OFF \-DQT_NO_X86_INTRINSICS=ON \-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++-8 \-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc-8 \-DCMAKE_ASM_COMPILER=/usr/bin/aarch64-linux-gnu-gcc-8 \
#-G 'Ninja' \ /home/a123/woniu/qt-everywhere-src-6.8.2/qtbase# 检查 configure 命令是否成功执行
if [ $? -eq 0 ]; thenecho "Configure successful."
elseecho "Configure failed."exit 1
fi# 编译项目(如果需要)
# ninja# 安装项目(如果需要)
# ninja install
unix makefiles版本
#!/bin/bash
# 指定使用的 shell 解释器为 bash# 定义安装前缀路径,确保是绝对路径
PREFIX=/home/a123/woniu/qt-everywhere-src-6.8.2/qtbase/install
# 设置软件安装的目录路径# 定义交叉编译平台
CROSS_PLATFORM="linux-aarch64-gnu-g++"
# 设置交叉编译的目标平台# 删除旧的构建目录
rm -rf build# 创建一个新的构建目录
mkdir -p build
cd build# 检查并安装 make(如果需要)
if ! command -v make &> /dev/null; thensudo apt updatesudo apt install make
fi# 运行 configure 脚本
/opt/cmake-3.31.0-rc2-linux-x86_64/bin/cmake \-DQT_INTERNAL_CALLED_FROM_CONFIGURE:BOOL=TRUE \-DBUILD_SHARED_LIBS=ON \-DCMAKE_INSTALL_PREFIX="$PREFIX" \-DQT_QMAKE_TARGET_MKSPEC="$CROSS_PLATFORM" \-DCMAKE_BUILD_TYPE=Release \-DINPUT_opengl=no \-DINPUT_strip=yes \-DFEATURE_system_sqlite=OFF \-DQT_NO_X86_INTRINSICS=ON \-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++-8 \-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc-8 \-DCMAKE_ASM_COMPILER=/usr/bin/aarch64-linux-gnu-gcc-8 \-G 'Unix Makefiles' \..# 检查 configure 命令是否成功执行
if [ $? -eq 0 ]; thenecho "Configure successful."
elseecho "Configure failed."exit 1
fi# 编译项目(如果需要)
# make -j12# 安装项目(如果需要)
# sudo make install
清理之前构建时导致的缓存
rm -rf CMakeCache.txt CMakeFiles/
还不行就删除build文件夹
这些命令其实是通过在源码目录中,运行 ./configure 脚本(将以上命令做成configure.sh脚本,先执行该脚本),并传递所需的参数,实现对qt库的编译和安装过程的配置的。
![](https://i-blog.csdnimg.cn/direct/94407ca5e4a74885ad01a96e07c248fc.png)
我这里出现了两个错误,
一个是Cmake版本过低,
Qt 6 需要CMake 3.16 或更高版本来支持其构建过程。
解决:
sudo apt update
sudo apt install cmake
不行的话就:
参考:
cmake --version//卸载旧版cmake
sudo apt remove cmake//下载源码包,注意不要使用受限制的网络,例如各种内部网络,可能会下载失败
//wget下载的文件默认保存到当前工作目录
wget https://cmake.org/files/v3.31///解压安装包
tar -zxvf cmake-3.24.0.tar.gz//进入目录
cd cmake-3.24.0//执行编译安装
./bootstrap && make && sudo make install
由于官网下要连github,这里下好放资源了 。
下载好后参考下面的文章安装好cmake,
Ubuntu 18.04 更新 cmake 到最新版本 3.31.2_cmake最新版本-CSDN博客‘
错误:
一个是无法读取位于 qtbase/config.opt 的配置文件。
config.opt通常是configure脚本生成的。
解决:
cmake更新后,文件正常生成,自动解决。
注意我上面用的是ninja生成器,而不是Make生成器。
使用的是 CMake 直接配置,可以指定 -G 'Ninja' 参数,,来生成 Ninja 构建文件。(CMake和Ninja配合使用)
当你使用 CMake 并指定 -G 'Ninja'
作为生成器时,CMake 会在指定的构建目录中生成一个名为 build.ninja
的文件。这个文件包含了构建项目所需的所有规则和依赖关系,由 Ninja 构建系统使用。
![](https://i-blog.csdnimg.cn/direct/9adf2081cbd8460b8af3aa15b23b9e65.png)
注意我这里使用的是ninja,和参考博客略有区别
cd build,到build目录下,然后 ninja make -j8
(.........好吧,我用ninja报错了,说ninja有个日志组件有问题要改版本,结果github连不上。又灰溜溜用回了
-G 'Unix Makefiles' \
..........配置文件已经改了备注,大家可以自行测试...')
构建成功
修改CMakeList.txt,使用c++17标准,GCC 9 及以上版本完全支持
<filesystem>
,无需手动链接stdc++fs库。因此编译器改成GCC9。(qmake.conf记得改)
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause# Need an explicit call at the top level. This is the absolute minimum version
# needed to configure the project with any combination of enabled features.
# The call to qt_build_repo_begin() will upgrade policies further.
#
# The absolute minimum version for building Qt is 3.16 because for metatype.json generation, we
# depend on being able to find the location of json files created by AUTOMOC/moc.
cmake_minimum_required(VERSION 3.16)# Get the repo version and CMake policy details
include(.cmake.conf)include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/QtBaseHelpers.cmake)qt_internal_check_if_path_has_symlinks("${CMAKE_BINARY_DIR}")# This needs to be called before the first project() call.
qt_internal_qtbase_run_autodetect()# This call will load any provided cmake toolchain file.
project(QtBaseVERSION "${QT_REPO_MODULE_VERSION}"DESCRIPTION "Qt Base Libraries"HOMEPAGE_URL "https://qt.io/"LANGUAGES CXX C ASM
)set(QT_BUILD_EXTRA_IDE_FILE_PATTERNS bin/* libexec/*)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)qt_internal_qtbase_build_repo()
安装arrch版本的GCC9和G++9
参考
https://zhuanlan.zhihu.com/p/690582548
ubuntu18.04的仓库默认不含GCC9版本,参考
在Ubuntu 18.04上安装gcc-9? ppa repository - Dev59
太慢了,直接手动装。网上教程多不赘述。
linaro官网
Downloads | GNU-A Downloads – Arm Developer
![]()
带be的是大端字节序,不带be的是小端字节序
-
如果配置成功,进入构建目录并运行
make
:bash复制
cd /home/a123/woniu/qt-everywhere-src-6.8.2/qtbase/build make -j12
![](https://i-blog.csdnimg.cn/direct/75eb61c93b0f4ed39edd5ae5b8514e51.png)
./configure \-prefix /home/a123/woniu/qt-everywhere-src-6.8.2/qtbase/install \-xplatform linux-aarch64-gnu-g++ \-no-opengl \-opensource \-confirm-license \-release \-strip \-shared \-c++std c++11 \-sqlite qt \-recheck-all