Ubuntu18.04 Qt Creator 交叉编译树莓派4B

前言

由于毕业设计中涉及到有关于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

Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第1张图片
修改后,按下[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

Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第2张图片
按[Ctrl+O]保存,[Ctrl+X]退出。

树莓派依赖环境安装

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/
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第3张图片
分别下载这三个压缩包,之后分别解压这三个压缩包,然后解压后文件夹里的内容一起合并到~/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 Creator

下载及安装

下载Qt 安装包,下载地址:https://download.qt.io/archive/qt/
下载完成后,修改文件的属性,修改为可执行文件,
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第4张图片

~/raspi下新建Qt文件夹之后双击打开安装包,选择安装路径在~/raspi/Qt下面。

sysroot

这里是把树莓派上的库复制到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

配置Qt Creator

1、添加设备

工具==>选项==>设备

点击添加Generic Linux Device
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第5张图片
添加树莓派IP地址以及登录用户名
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第6张图片
导入或新建公钥
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第7张图片
新建结束后
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第8张图片
由于ssh连接使用密钥对来验证的,所以我们需要把主机的公钥发送到树莓派那边

ssh-copy-id -i ~/.ssh/qtc_id.pub user@hostname

公钥文件要根据产生的名字来改

点击Test,确认是否连接成功
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第9张图片
2、添加编译器

工具==>选项==>Kit==>编译器

点击添加gcc C和C++编译器,分别导入交叉编译器的位置

~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-gcc  # C编译器
~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-g++ # C++编译器

Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第10张图片
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第11张图片
3、添加Debuger

version name: Qt 5.14.2(Raspberry Pi 4)

qmake location:~/raspi/qt5-host/bin/qmake

Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第12张图片
4、配置kit
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第13张图片
大致设置这几个较为重要的参数后点击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

重启树莓派。

PC

新建一个工程后,修改.pro文件后面的可执行文件的输出位置
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第14张图片

# 删去原来的target.path,改成树莓派上放程序的路径
target.path = /home/pi/qt5

在PC上点击运行后在树莓派的文件夹下就会出现可执行文件
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第15张图片
Ubuntu18.04 Qt Creator 交叉编译树莓派4B_第16张图片

仍需解决的问题

点击运行后在树莓派上并不能运行起来必须去双击才行,这个目前已经看到QtCreator里的报错,准备根据报错修复。

你可能感兴趣的:(C++学习笔记,qt,linux)