配置虚拟机x86_64(Ubuntu 20.04) 和 Jetson nano ARM64(Ubuntu 18.04)的Qt5.4.2交叉编译环境,具体硬件环境如下:
VMware虚拟机(X86_64)
Jetson nano(aarch64)
流程上主要参考:
Ubuntu20.04.1(X86_64)Qt5.14.2配置ARM64交叉编译环境
JetsonNano QT5.12.9交叉编译和环境搭建
1. 交叉编译环境配置:
1.1 在虚拟机上安装Qt 5.14.2(更建议先进行1.2和1.3节,再安装Qt)
- 直接执行 .run 程序,程序自行下载
文件下载地址
出现界面,进行安装,位置如下,自行选择:
不确定需要什么,就安装全部组件。安装完毕后Qt就可以正常启动了。
查看一下安装路径:可以看到只有gcc_64
1.2 安装ARM64编译器,建一个Jetson nano的交叉编译环境
参考:
ubuntu16.04 安装交叉编译工具aarch64-linux-gnu-gcc/g++
NVIDIA Jetson NX 交叉编译环境Ubuntu18.04
- 首先查看Jetson nano的系统版本和编辑器版本:gcc / g++ --version 或者 gcc / g++ -v
可以看出是ubuntu 18.04 和 aarch64-linux-gnu
经过证实, Ubuntu18.04 和 20.04 上均可以成功建立交叉编译环境
1.2.1 Ubuntu安装aarch64版本gcc、g++
gcc是GCC中的GUN C Compiler(C 编译器). g++是GCC中的GUN C++ Compiler(C++编译器)
参考:Ubuntu交叉编译aarch64版本qt
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
安装如下:
安装完成后查看版本:
aarch64-linux-gnu-gcc -v
也可以输入aarch64 +TAB是否出现提示,从而查看配置是否成功 :
1.2.2 Ubuntu中aarch64版本gcc、g++ 交叉编译测试
写个简单的demo测试一下
- 虚拟机中:
/*
* test.cpp
* for cplusplus
* test aarch64-linux-gnu-g++
*/
# include<iostream>
int main(int argc,char **argv)
{
std::cout << "hello world!" <<std::endl;
return 0;
}
在虚拟机中编译:
aarch64-linux-gnu-g++ test.cpp -o test
显然,在这里无法执行,然后将生成的可执行文件放到嵌入式板子上运行,权限不够的话记得加权限
- Jetson nano开发板中
交叉编译环境配置成功!!!,可以查看文件的类型如下,是ARM的可执行文件
1.3 编译Qt源码(编译出对应的arm64平台工具链)
方案:因为Jetson nano的资源较少,所以在自己的PC上配置ARM64的编译环境,配置Qt交叉编译环境,然后用Qt编译自己写的代码,在PC上编译完成后,copy到ARM平台上运行
1.3.1 qt-everywhere-src-5.14.2.tar.xz Qt源码
源码压缩文件下载地址
然后将压缩包 1 解压,得到文件夹 2.
1.3.2 修改编译配置文件
参考:
Ubuntu交叉编译aarch64版本qt
JetsonNano QT5.12.9交叉编译和环境搭建
- 修改位于源码中的 qmake.conf 文件
位置:qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf
- 文件内容如下:
上面红框中工具需要和自己的交叉编译工具,保持一致,否则编译失败
添加如下的内容,进行修改:为何这样改,后面再研究**qmake.conf**
,参数作用参考Qt5.12.11交叉编译+64位ARM_aarch64+全志H5 CortexA53
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts
修改后如下(Jetson-nano是armv8架构):
1.3.3 开始编译(此节的配置暂时有错误,还没有配置成功,直接看1.3.4)
进入源码目录cd qt-everywhere-src-5.14.2
,创建文件 autoConfigure.sh 进行编译选项的配置
cd qt-everywhere-src-5.12.9/
touch autoConfigure.sh
chmod 777 autoConfigure.sh
内容如下:
#!/bin/sh
./configure \
-prefix /home/feiyangqu/myFile/Qt/Qt5.14.2-aarch64 \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-sse2 \
-no-cups \
-no-glib \
-no-dbus \
-no-opengl \
-no-xcb \
-no-separate-debug-info \
- 直接在源码目录,即 autoConfigure.sh 文件在的目录运行
./autoConfigure.sh
,然后进行编译我遇到的问题以及解决: - 遇到问题:
You don’t seem to have ‘make’ or ‘gmake’ in your PATH.
Cannot proceed.
解决办法:安装build 的组件sudo apt-get install build-essential
,即可运行成功
- 然后再make,出现错误:Project ERROR: Building QtQml requires Python.
参考:从源代码构建Qt时找不到Python 和 building qtqml requires python
解决如下:
1.3.4 开始编译(请把该节读完再编译!!!提前排查自己遇到的错误)
前面运行./autoConfigure.sh
错误较多,就直接终端使用了下面的语句然后make
:
- 首先安装库:参考linux环境下编译Qt源码
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev
sudo apt-get install libegl1-mesa-dev
sudo apt-get install freeglut3-dev
sudo apt-get install libclang-dev
- 然后终端进入源码文件夹,运行下面的命令进行配置
./configure -prefix /home/feiyangq/myFile/Qt/Qt5.14.2-aarch64 -make libs -xplatform linux-aarch64-gnu-g++ -no-opengl -skip qtdeclarative
- 这里主要注意xplatform目标平台和extprefix安装目录:JetsonNano QT5.12.9交叉编译和环境搭建
-prefix 是QT编译后文件目录
-xplatform 是arm编译器类型,在qtbase/mkspecs目录下,根据自己交叉编译工具进行相应的替换
-no-opengl 跳过编译openGL(因为我已经安装了Qt,所以不需要界面)
-skip qtdeclarative 跳过 qtdeclarative(不跳过,编译出错,出错的原因不清楚)
如果有别的需求,可以./configure -help查看具体命令
- 注意终端显示的信息,进行库的添加(在前面已经添加过了,此为添加前错误的截图):
make成功如下:
然后直接make install
,就可以看到前面 configure 处 -prefix 参数的位置出现我们指定的安装目录:/home/feiyangq/myFile/Qt/Qt5.14.2-aarch64
安装成功!!!
1.4 Qt配置交叉编译环境
1.4.1 打开Qt, 手动添加ARM64编译器
在qt creator中加入刚才编译安装的arm版qt,详细步骤参考:Ubuntu20.04.1(X86_64)Qt5.14.2配置ARM64交叉编译环境
不过打开编译器部分,我的已经可以在 Auto-detected 看到 arm64 的编译器。可能因为我是先编译源码,后用 run 文件安装的 Qt:
添加 GCC 的 C / C++编译器中的 aarch64-linux-gnu-gcc / g++
,好奇的查了一下aarch64-linux-gnu-cpp,cpp是The C Preprocessor(预处理器):
- 查看编译器位置,研究一下
usr/
目录:
usr目录的研究:Linux 系统的/usr目录
linux 中的 usr 是什么含义
/bin, /sbin, /usr/sbin, /usr/bin 目录之简单区别
Linux下/usr/bin与/usr/local/bin/区别总结
总结要点:- 不改变configure文件,Aotomake工具安装的应用就安装在
/usr/local/
目录; - usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;所有系统默认的软件都会放置到/usr, 系统安装完时,这个目录会占用最多的硬盘容量
/bin
是系统的一些指令。/sbin
一般是指超级用户指令。/usr/bin
是你在后期安装的一些软件的运行脚本。/usr/sbin
放置一些用户安装的系统管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、named、netconfig、squid、swap、tcpd、tcpdump等。- 新装的系统,运行一些很正常的诸如:shutdown,fdisk的命令时,提示:bash:command not found。那么首先就要考虑 root 的
$PATH
里是否已经包含了这些环境变量。可以查看PATH,如果是:PATH=$PATH:$HOME/bin
则需要添加如下:PATH=$PATH:$HOME/bin:/sbin:/usr/bin:/usr/sbin
- 查看 usr/bin/ 中和 aarch 相关的文件
再看一下 usr/ 中也有 aarch64-linux-gun 文件夹:
进入文件夹查看内容如下:
- 不改变configure文件,Aotomake工具安装的应用就安装在
1.4.2 添加QT Versions
QT Versions 中添加之前那编译源码得到的 交叉编译版的 Qt:
1.4.2 添加构建套件(Kits)
1.5 新建工程&编译,测试是否成功
1.5.1 新建工程&编译
- 新建一个项目,到构建套件(Kits)选择这一步时候,选择aarch64的套件:
build 构建项目,得到的项目文件夹如下:
- 查看文件属性:验证成功!!!
1.5.2 将文件传到Jetson nano开发板上进行测试
Jetson nano的Qt安装以及测试:待续。。。。
2. Docker中配置交叉编译环境
2.1Docker的安装
见文章:Docker的安装(Ubuntu 20.04 LTS)(包括对官方文档的介绍)
待续。。。。。
开了一个坑,会随着项目的进行持续更新。