交叉编译就像用中文写菜谱给外国厨师做菜——我们需要一套翻译工具让Ubuntu生成的程序能被RK3568理解。首先从工具链开始,RK3568官方提供的prebuilts工具链通常包含在SDK包里,我建议直接使用官方版本避免兼容性问题。
把工具链解压到/opt目录是个好习惯,这里所有用户都能访问又不会污染系统目录。具体操作如下:
bash复制sudo mkdir -p /opt/toolchains
sudo cp -r rk3568_linux/prebuilts/gcc/linux-x86/aarch64-gcc-buildroot /opt/toolchains/
接下来需要配置环境变量,这里有个实用技巧:不要直接修改.bashrc,而是创建单独的env.sh文件。这样不同项目可以加载不同的配置:
bash复制# 创建环境变量配置文件
echo 'export RK3568_TOOLCHAIN=/opt/toolchains/aarch64-gcc-buildroot
export PATH=$RK3568_TOOLCHAIN/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-buildroot-linux-gnu-' > ~/rk3568_env.sh
验证工具链是否生效时,新手常犯的错误是直接运行编译器命令。更可靠的做法是检查版本信息:
bash复制source ~/rk3568_env.sh
aarch64-buildroot-linux-gnu-gcc --version
如果看到正确的版本输出,说明工具链配置成功。遇到问题时,建议先用最简单的helloworld程序测试:
c复制// test.c
#include <stdio.h>
int main() {
printf("Toolchain test passed!\n");
return 0;
}
编译测试程序:
bash复制aarch64-buildroot-linux-gnu-gcc test.c -o test
file test # 应该显示ARM aarch64可执行文件
Qt就像乐高积木,我们需要选择适合嵌入式系统的模块。从官网下载源码时要注意版本兼容性,5.15 LTS是最稳定的选择。解压源码后,重点在于configure参数的配置:
bash复制tar xvf qt-everywhere-src-5.15.8.tar.xz
cd qt-everywhere-src-5.15.8
创建自动配置脚本时,这几个参数最关键:
这是我优化过的配置脚本:
bash复制#!/bin/bash
PREFIX=$(pwd)/arm64_install
TOOLCHAIN_PREFIX=/opt/toolchains/aarch64-gcc-buildroot
./configure \
-prefix $PREFIX \
-release \
-opensource \
-confirm-license \
-xplatform linux-aarch64-gnu-g++ \
-linuxfb \
-no-opengl \
-no-xcb \
-no-gtk \
-qt-zlib \
-qt-libjpeg \
-qt-libpng \
-no-sql-sqlite \
-no-icu \
-no-dbus \
-no-feature-getentropy \
-skip qtwebengine \
-skip qt3d \
-skip qtmultimedia \
-nomake examples \
-nomake tests \
-sysroot $TOOLCHAIN_PREFIX/sysroot \
-I $TOOLCHAIN_PREFIX/include \
-L $TOOLCHAIN_PREFIX/lib
编译过程中常见内存不足问题,可以通过swap分区解决:
bash复制sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
编译完成后,验证qmake是否正确生成:
bash复制./arm64_install/bin/qmake -query
虽然命令行也能开发,但Qt Creator能极大提升效率。配置时要注意这几个关键点:
创建新项目时,pro文件需要特殊配置:
qmake复制# 目标平台设置
TARGET = myapp
TEMPLATE = app
# 使用Qt模块
QT += core gui widgets
# 交叉编译标志
QMAKE_CC = $${RK3568_TOOLCHAIN}/bin/aarch64-buildroot-linux-gnu-gcc
QMAKE_CXX = $${RK3568_TOOLCHAIN}/bin/aarch64-buildroot-linux-gnu-g++
QMAKE_LINK = $${RK3568_TOOLCHAIN}/bin/aarch64-buildroot-linux-gnu-g++
# 优化选项
QMAKE_CXXFLAGS += -O2 -march=armv8-a
调试时有个实用技巧:在开发板上运行gdbserver:
bash复制gdbserver :9091 ./myapp
然后在Qt Creator中配置远程调试:
直接拷贝可执行文件往往会遇到库缺失问题。我推荐使用linuxdeployqt工具自动收集依赖:
bash复制# 下载并编译linuxdeployqt
git clone https://github.com/probonopd/linuxdeployqt.git
cd linuxdeployqt
qmake && make
# 打包应用
./linuxdeployqt myapp -qmake=/path/to/arm64_install/bin/qmake
生成的文件结构应该是这样的:
code复制deploy/
├── lib/ # 所有依赖库
├── plugins/ # Qt插件
├── myapp # 主程序
└── run.sh # 启动脚本
启动脚本需要设置库路径:
bash复制#!/bin/sh
export LD_LIBRARY_PATH=$(dirname $0)/lib:$LD_LIBRARY_PATH
$(dirname $0)/myapp
性能优化方面,RK3568的GPU加速需要特别配置:
cpp复制// 在main.cpp中添加
QApplication::setAttribute(Qt::AA_UseOpenGLES);
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
部署后如果出现字体问题,可以打包系统字体:
bash复制mkdir -p deploy/fonts
cp /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf deploy/fonts/
最后用rsync快速部署到开发板:
bash复制rsync -avz deploy/ user@192.168.1.100:/home/user/app
问题1:运行时报错找不到库
解决方法:
bash复制# 在开发板上检查依赖
ldd myapp | grep not
问题2:界面显示异常
可能是缺少平台插件,确保部署目录包含:
code复制plugins/
└── platforms/
└── libqlinuxfb.so
问题3:触摸屏不响应
需要配置tslib环境变量:
bash复制export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
问题4:内存不足
在开发板上设置swap:
bash复制dd if=/dev/zero of=/swapfile bs=1M count=512
mkswap /swapfile
swapon /swapfile
记录日志的小技巧:
cpp复制// 重定向qDebug输出
qInstallMessageHandler([](QtMsgType type, const QMessageLogContext &context, const QString &msg) {
QFile file("/var/log/myapp.log");
if(file.open(QIODevice::Append)) {
file.write(msg.toUtf8() + "\n");
file.close();
}
});