由于毕业设计中涉及到有关于Qt界面的部分内容,如果是在树莓派上直接安装Qt Creator其本身占用较多内存以及性能不能跟电脑相比,用起来会较为卡顿比较影响使用,所以我就参考了知乎上的相关文章在自己的电脑上搭建其Qt的交叉编译环境。
这里就贴上知乎链接:https://zhuanlan.zhihu.com/p/138021025?utm_source=qq
在安装完系统后我们一般会对系统进行换源,这是因为有些包我们在下载的过程中,它是使用外国的网址,网速非常慢,所以我们经常把系统更新的源和下载源都使用国内的镜像。
1、修改软件更新源
1.1 打开sources.list
sudo nano /etc/apt/sources.list
1.2 修改源
这里的话我换成了清华源,将原有的源注释后,在后面加上新的源
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
修改后,按下[Ctrl+O]保存修改,然后按[Ctrl+X]退出
2、修改系统更新源
2.1 打开raspi.list
sudo nano /etc/apt/sources.list.d/raspi.list
2.2 修改源
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
1、在树莓派上安装以下包
# Qt base依赖的包
sudo apt-get install libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev
# mesa gbm驱动
sudo apt-get install libgles2-mesa-dev libgbm-dev
# 蓝牙相关 可以不用安装
sudo apt-get install bluez libbluetooth-dev
# 中文字体
sudo apt-get install ttf-wqy-zenhei
# 用于远程调试的GDB Server
sudo apt-get install gdbserver
1.2 在树莓派上建立文件夹后修改其权限
建立的文件夹分别是用来安装qt的运行库以及编译生成qt程序的可执行文件,位置可以随便选择,要记住这个位置,因为后续的使用过程中会一直使用到的。
sudo mkdir /usr/local/qt5pi # 用来安装qt运行库
sudo chown -R pi:pi /usr/local/qt5pi
mkdir /home/pi/qt5 # 用来存放以后自己写的qt程序可执行文件
这里我就直接参考知乎教程上的方式建立一个专门用于存放的交叉编译器的文件夹
mkdir ~/raspi
mkdir ~/raspi/cross-compile-tool
cd ~/raspi
在linaro网站下载交叉编译工具链
网址:https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/
分别下载这三个压缩包,之后分别解压这三个压缩包,然后解压后文件夹里的内容一起合并到~/raspi/cross-compile-tool下,在合并过程中出现重名的文件夹一并合并起来。
然后设置环境变量:
echo 'export PATH=$PATH:~/raspi/cross-compile-tool/' | sudo tee -a /etc/profile
# echo后面一定要用单引号
source /etc/profile
# 刷新环境变量
然后输入
sudo visudo
然后在secure_path后面的路径中追加一串:/home/你的用户名/raspi/cross-compile-tool/bin。
检查配置
arm-linux-gnueabihf-g++ -v
sudo arm-linux-gnueabihf-g++ -v
如果失败的话就安装提醒的操作
sudo apt-get install arm-linux-gnueabihf-g++
sudo apt-get install arm-linux-gnueabihf-g++
后面可能会有存在依赖缺失,我们就按照提示安装依赖。
下载Qt 安装包,下载地址:https://download.qt.io/archive/qt/
下载完成后,修改文件的属性,修改为可执行文件,
在~/raspi
下新建Qt文件夹之后双击打开安装包,选择安装路径在~/raspi/Qt下面。
这里是把树莓派上的库复制到PC上来
在PC上执行以下命令
cd ~/raspi
mkdir sysroot
rsync -avz 树莓派用户名@树莓派IP:/lib sysroot #复制lib到sysroot下
cd ~/raspi/sysroot
mkdir usr
rsync -avz 树莓派用户名@树莓派IP:/usr/include sysroot/usr
rsync -avz 树莓派用户名@树莓派IP:/usr/lib sysroot/lib
cd ~/raspi/sysroot
mkdir opt
rsync -avz 树莓派用户名@树莓派IP:/opt/vc sysroot/opt
然后需要修改sysroot里面的软链接,里面有很多软连接使用的都是绝对路径,那就会直接链接到你PC的/usr、/lib目录里面去,那肯定是错的,我们希望它们链接到sysroot里面对应的库。所以我们需要把绝对路径改成相对路径。
直接用网上现成的python脚本完成。
在raspi下新建sysroot-relativelinks.py
touch sysroot-relativelinks.py
将下面代码复制到py文件下
#!/usr/bin/env python
import sys
import os
# Take a sysroot directory and turn all the abolute symlinks and turn them into
# relative ones such that the sysroot is usable within another system.
if len(sys.argv) != 2:
print("Usage is " + sys.argv[0] + "" )
sys.exit(1)
topdir = sys.argv[1]
topdir = os.path.abspath(topdir)
def handlelink(filep, subdir):
link = os.readlink(filep)
if link[0] != "/":
return
if link.startswith(topdir):
return
#print("Replacing %s with %s for %s" % (link, topdir+link, filep))
print("Replacing %s with %s for %s" % (link, os.path.relpath(topdir+link, subdir), filep))
os.unlink(filep)
os.symlink(os.path.relpath(topdir+link, subdir), filep)
for subdir, dirs, files in os.walk(topdir):
for f in files:
filep = os.path.join(subdir, f)
if os.path.islink(filep):
#print("Considering %s" % filep)
handlelink(filep, subdir)
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot
首先找到Qt的安装路径,这里我之前是安装在~/raspi/QT下
cd ~/raspi/QT/5.14.2/Src/qtbase/
选择qtbase,这里面包含了qt的基本的东西,然后设置编译选项
./configure -release -opengl es2 -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -reduce-exports -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5pi-host -v
参数我是按照知乎教程上搞的,这里按照他的解释是
-device linux-rasp-pi4-v3d-g++
:使用qtbase/mkspecs/device/linux-rasp-pi4-v3d-g++下的配置
-device-option CROSS_COMPILE=~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-
: 交叉编译工具链的前缀,注意最后那个“-”号是不能少的
-prefix /usr/local/qt5pi: Qt最终安装到树莓派中的位置
-extprefix ~/raspi/qt5pi: PC上交叉编译好的Qt的位置
-hostprefix ~/raspi/qt5pi-host: 编译出来给PC用的交叉编译工具存放的位置
配置结束后,进行编译后下载即可
make -j4 && sudo make install
把编译好的Qt安装到树莓派
rsync -avz qt5pi 树莓派用户名@树莓派IP:/usr/local
1、添加设备
工具==>选项==>设备
点击添加Generic Linux Device
添加树莓派IP地址以及登录用户名
导入或新建公钥
新建结束后
由于ssh连接使用密钥对来验证的,所以我们需要把主机的公钥发送到树莓派那边
ssh-copy-id -i ~/.ssh/qtc_id.pub user@hostname
公钥文件要根据产生的名字来改
工具==>选项==>Kit==>编译器
点击添加gcc C和C++编译器,分别导入交叉编译器的位置
~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-gcc # C编译器
~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-g++ # C++编译器
version name: Qt 5.14.2(Raspberry Pi 4)
qmake location:~/raspi/qt5-host/bin/qmake
4、配置kit
大致设置这几个较为重要的参数后点击Apply、OK完成配置,重启Qt Creator
首先还是要适配树莓派的环境变量,在/etc/profile后面添加
# 存放我们自己编写的qt程序的路径
export PATH=$PATH:/home/pi/qt5
# eglfs屏幕物理尺寸,单位毫米
export QT_QPA_EGLFS_PHYSICAL_WIDTH=84
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=56
# eglfs屏幕分辨率
export QT_QPA_EGLFS_WIDTH=480
export QT_QPA_EGLFS_HEIGHT=320
# 其他
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH # 链接库路径
export QTDIR=/usr/local/qt5pi
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_HIDECURSOR=1
export QT_QPA_EGLFS_ALWAYS_SET_MODE="1" # 这个非常重要,我也不知道为啥,没有这条就不行
export QML_IMPORT_PATH=$QTDIR/qml
export QML2_IMPORT_PATH=$QTDIR/qml
重启树莓派。
# 删去原来的target.path,改成树莓派上放程序的路径
target.path = /home/pi/qt5
点击运行后在树莓派上并不能运行起来必须去双击才行,这个目前已经看到QtCreator里的报错,准备根据报错修复。