这是我毕业后做的第一个项目。项目过程中,要求把之前在Windows上编译的Qt程序移植到Rockchip RK3399 Pro开发板上。参考了网上的诸多资料后,现在已经可以在开发板上跑通Qt程序 (๑ `▽´๑)
由于我的Qt程序之前是在Windows上编写的,因此第一步需要将它拷贝到Linux系统下。需要注意要把文件里的图片也拷贝过去。
Linux版本:Ubuntu 16.04
Qt版本:5.9.4
注意! 这里的交叉编译器必须是你的目标开发板配套的交叉编译工具。在下载之前,要先查清你Linux的glibc版本。glibc是gnu发布的libc库,也即c运行库。glibc是linux 系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。
ldd --version
显示的结果是
ldd (Ubuntu GLIBC 2.23-0ubuntu11.2) 2.23
Copyright (C) 2016 自由软件基金会。
这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性
或者适合某些特殊目的。
由 Roland McGrath 和 Ulrich Drepper 编写。
可见本机的glibc版本是2.23,属于比较旧的版本。
然后下载交叉编译工具,下载地址。 此处给出的是最新版本的交叉编译器,但它与本机glibc版本并不兼容。查询到本机适用版本为gcc-linaro-6.3.1。可以尝试通过在浏览器修改网页链接找到下载地址 ʕ•ﻌ•ʔ
将下载的交叉编译工具gcc-linaro-6.3.1-2018.12-x86_64_aarch64-linux-gnu.tar.xz 复制到你想安装的目录下,此处选择/opt。
//在下载目录下打开终端
sudo mv gcc-linaro-6.3.1-2018.12-x86_64_aarch64-linux-gnu.tar.xz /opt
复制完成后在/opt目录下输入命令。
tar -xvf gcc-linaro-6.3.1-2018.12-x86_64_aarch64-linux-gnu.tar.xz /opt/gcc-aarch64-linux-gnu
将文件解压并重命名为gcc-aarch64-linux-gnu,然后将/opt/gcc-aarch64-linux-gnu/bin目录添加到环境变量中,输入命令。
sudo gedit /etc/profile
在末尾添加如下内容。
export PATH="/opt/gcc-aarch64-linux-gnu/bin:$PATH"
点击保存后输入如下命令使环境变量生效。
source /etc/profile
接着通过下面的命令来验证是否安装成功。
aarch64-linux-gnu-gcc -v
若输出如下结果,证明交叉编译器安装成功。
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/gcc-aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/6.3.1/lto-wrapper
Target: aarch64-linux-gnu
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/snapshots/gcc.git~linaro-6.3-2017.05/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)
首先在官网下载qt-everywhere-opensource-src-5.9.4.tar.xz,下载地址。
将下载的压缩包复制到/opt目录下,解压
tar -xvf qt-everywhere-opensource-src-5.9.4.tar.xz
然后编辑linux-aarch64-gnu-g++的qmake.conf文件。aarch64-gnu-g++是RK3399 Pro使用的编译器。
sudo gedit /opt/qt-everywhere-opensource-src-5.9.4/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf
在打开的文件中添加如下内容
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts
如图所示
点击保存,然后在/opt/qt-everywhere-opensource-src-5.9.4下输入
sudo gedit auto.sh
新建的auto.sh为交叉编译自动配置脚本,在其中添加以下内容
#!/bin/sh
./configure \
-prefix /opt/qt5.9.4-arm \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-dbus \
-no-separate-debug-info \
其中/opt/qt5.9.4-arm 为编译后的安装目录,-xplatform linux-aarch64-gnu-g++为交叉编译相关选择。
接着修改该文件权限并执行。
sudo chmod u+x auto.sh
./auto.sh
结束后会显示如下结果并生成Makefile文件。
//-j是指在编译时用多少个线程进行编程,数字越大速度越快,最大值取决于你电脑的性能
sudo make -j64
这里需要执行比较长的一段时间。
然后输入。
sudo make install
执行成功后,可以看见/opt目录下出现了我们指定的安装目录/opt/qt5.9.4-arm,表示安装成功。
在官网下载qt-opensource-linux-x64-5.9.4.run,下载地址. 查看更多版本可查看:下载地址.
把下载下来的文件放到/opt下.
//在下载目录下打开终端
sudo mv qt-opensource-linux-x64-5.9.4.run /opt
输入命令.
1. sudo chmod u+x qt-opensource-linux-x64-5.9.4.run
2. ./qt-opensource-linux-x64-5.9.4.run
按照提示点击下一步,直到此处,按照图示选择.
cd /opt/Qt5.9.4/Tools/QtCreator/bin
./qtercator
结果如下:
*可根据需要锁定至启动器。
在工具-选项中添加交叉编译器。在如下位置手动添加路径,选择前面下载的交叉编译器位置,GCC和G++都要添加。
然后在Qt versions栏选择Qt版本,路径为交叉编译后安装的qt路径,如下图所示。
这里可以指定多个Qt版本,如果需要在PC上调试代码,可以安装一个Linux的Qt环境并在这里添加。
最后在构建套件栏目添加套件,如下图所示,包括名称、设备类型、编译工具、Qt版本等信息,如下图所示。
如果添加了多个环境,在项目栏点击灰色的环境直接添加,以后编译时就可以很方便地切换环境。
首先要将交叉编译的Qt库复制到开发板,这里通过ssh发送。在开发板上输入
scp 发送者id@发送者ip:发送文件路径 接收文件路径
//例如:scp [email protected]:~/example ./
发送前可能要关闭PC端的防火墙。
systemctl stop ufw
发送后,需要将安装目录下的include、 lib、 plugins添加到开发板的环境变量中。
输入
sudo gedit /etc/profile
在文件末尾添加你的Qt路径,请根据实际情况修改。
export QTEDIR=/opt/qt5.9.4-arm/
export LD_LIBRARY_PATH=$QTEDIR/lib:$LD_LIBARAY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FONTDIR=/usr/share/fonts/truetype/droid
然后保存,输入如下命令让环境变量生效。
source /etc/profile
最好重启一下。
在QtCreator交叉编译你的Qt程序,注意,编译后的程序是无法在PC上运行的!编译成功后默认会在统计目录生成一个Debug文件,如"build-XXX-ARM-Debug",里面有一个可执行文件,将它发送到开发板上。
然后在开发板上输入
sudo 你的可执行文件
成功执行,大功告成 (๑•̀ㅂ•́)و✧