I.MX6U开发板交叉编译Qt项目(什么是交叉编译器;如何搭建Qt交叉编译环境;WinSCP将Windows中的文件传到Ubuntu中;如何将编译好的执行文件拷到开发板上)

关于C++基础可以参考:C++57个入门知识点进行学习,关于Qt的内容可以参考:QT从入门到实战x篇Qt 5.9 C++开发指南进行学习,当然之前所发的对应地址也是不错的学习内容。

1. 关于嵌入式学习的一些思考

1.1 使用imx6 还是stm32mp?

关于嵌入式使用imx6 还是stm32mp作为嵌入式学习的开发板,搜集了一些网络上的建议。

  • 1.芯片、软件成熟度: IMX6ULL是NXP公司的、经过考验的芯片,在众多工控领域、汽车电子上都应用广泛,Linux内核等配套软件都比较成熟稳定了。而STM32MP157是ST公司的第一款能运行Linux的芯片,在产品应用、软件成熟度方面都弱于IMX6ULL。

  • 2. 性能与价格: STM32MP157性能强于IMX6ULL,价格也贵于IMX6ULL。所以做产品的话需要考虑性价比。

  • 3. 就学习而言: STM32MP157有3个核:2个A7用来运行Linux,1个M4用来运行单片机程序。STM32MP157还有GPU。理论上使用STM32MP157可以学习到更多知识;但是目前IMX6ULL的资料是更多。但是无论你是买IMX6ULL还是买STM32M157都可以学习。

但是网上有提到:

  • 学习用什么都行,做项目要用I.MX6。
  • 芯片按照良品率认定标准、抗震、抗磁、耐热、耐寒、防冻等性能指标,分为五个认证级别。
  • 其中民用的有三个,从低到高为消费级、工业级、车规级
  • STM32mp157由于工业级认证不全,所以严格来说只能算消费级,或称准工业级。而1.MX系列是车规级芯片。

本人的目的暂时只是了解工业应用的,虽然对应资源两种都同时做了介绍,那就选择 imx6 作为重点,也是后期博文介绍的内容。

1.2 关于是否需要买板子

以下为引用一位做pc的gpu驱动开发老哥的话:
“作为一个资深的板子吃灰玩家,告诉你个不花一分钱的方法,用你手上的电脑学linux足够了
装个虚拟机,虚拟机里面装个Ubuntu,想折腾啥自己搞。你自己的cpu性能,不把什么imx6ull.
stm32吊着锤?
想折腾什么摄像头,直接买个usb版的摄像头插上去,折腾去吧。想折腾传感器,买个usb转串口折腾去吧。哪天不想折腾了,虚拟机Ubuntu直接删了,还不浪费钱。”

当然也是有用QEMU模拟器为硬件平台的,具体可以参考下:项目介绍:嵌入式QEMU教程

因为目前我还不了解嵌入式编程的具体细节,先按照需要购买开发板进行学习,等深入一些之后再考虑是否购买开发板或者使用QEMU模拟器进行学习。

2. I.MX6U开发板交叉编译Qt项目

在已经了上面所提到的基础后,以下将介绍如何Qt写的项目在开发板上运行起来呢?本篇将会介绍I.MX6U交叉编译Qt项目。

2.1 什么是交叉编译器

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。
简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。

2.2 安装交叉编译器

2.2.1 下载交叉编译器和资料

进入OpenEdv-开源电子网-正点原子论坛,正点原子的相关资料均是免费下载的。随便进入哪个模块,在置顶位置均可看到下载中心地址,这里放了该地址的链接,直接点击进入即可:正点原子资料下载中心
选择如下框选的链接:介绍说“Mini Linux开发板”与所框选的资料内容是一样的。
在这里插入图片描述
点击后界面如下,选择框选内容:
在这里插入图片描述
选择“05、开发工具.zip”进行下载,在“10、用户手册”文件夹中的“01【正点原子】I.MX6U用户快速体验V2.6”对使用的交叉编辑工具的使用进行了介绍。

以下为截取部分介绍内容:
“搭建交叉编译环境是学习 Linux 很重要的一步,正点原子提供两种交叉编译工具链。这两种交叉编译工具链解释如下图。这两种编译器都有各自的作用,我们只要在相应的实验里使用指定的交叉编译工具链即可,切勿混着用。 同时它们的使用方法是不一样的,不能生搬硬套!第一种交叉编译器使用的方法,请参考本文档的 4.2~4.7 小节。第二种交叉编译器请参考【正点原子】 I.MX6U 嵌入式 Linux 驱动开发指南。”
在这里插入图片描述
第一个中包含了Qt,如果需要编译Qt就使用第一个交叉编译器

2.2.2 使用WinSCP将Windows中的文件传到Ubuntu中

如何将Windows中的文件传到Ubuntu中,这里使用WinSCP,对于该软件的介绍:WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。.winscp也可以链接其他系统,比如linux系统。作为FTP客户端,它支持批量管理ftp站点。WinSCP 是一个Windows环境下使用SSH的开源图形化SFTP 客户端,同时支持SCP协议。 它的主要功能就是在本地与远程计算机间安全地复制文件。

具体使用方法如下:
(1)安装该软件,可以直接从360中进行下载安装。
(2)查询Ubuntu的ip地址
由于我的系统没有安装一些软件,需要先安装,后查询

dawes@ubuntu:~$ ifconfig

Command 'ifconfig' not found, but can be installed with:

sudo apt install net-tools

dawes@ubuntu:~$ sudo apt install net-tools
dawes@ubuntu:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.126.129  netmask 255.255.255.0  
        ......

192.168.126.129即为Ubuntu的ip地址。
(3)新建会话
在这里插入图片描述
显示被拒绝
在这里插入图片描述
问题应该是来自于Ubuntu设置,尝试解决。解决方案参考:WinSCP连接Ubuntu被拒绝,我只执行了前几步就可以了。

dawes@ubuntu:~$ sudo ufw disable   #关闭防火墙
[sudo] dawes 的密码: 
防火墙在系统启动时自动禁用
dawes@ubuntu:~$ sudo apt-get install openssh-server #安装openssh-server
dawes@ubuntu:~$ ps -e|grep ssh  #检查sshd是否启动,看到sshd说明启动成功
  2056 ?        00:00:00 ssh-agent
  4055 ?        00:00:00 sshd

解决过程中要保证Ubuntu系统是打开状态,连接网络,使用ping是可以与主机windows是可以通讯的。

此时进行连接,显示如下:
在这里插入图片描述
连接之后,windows切换地址,整体界面如下(只有Ubuntu系统是打开状态才可以连接):
在这里插入图片描述
(4)拖动文件至Ubuntu系统中
在这里插入图片描述
显示已经拖过来
在这里插入图片描述

2.2.3 Qt交叉编译环境搭建

按照“05【正点原子】I.MX6U出厂系统Qt交叉编译环境搭建V1.6”中的内容安装
在这里插入图片描述
执行下面的指令修改脚本的权限,修改权限后可以看到此脚本颜色显示改变,说明修改成功。

chmod u+x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh

在这里插入图片描述
直接执行脚本安装交叉编译工具,安装过程如下:

dawes@ubuntu:~$ ./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh
Freescale i.MX Release Distro SDK installer version 4.1.15-2.1.0
================================================================
Enter target directory for SDK (default: /opt/fsl-imx-x11/4.1.15-2.1.0): 
You are about to install the SDK to "/opt/fsl-imx-x11/4.1.15-2.1.0". Proceed[Y/n]? y
[sudo] password for dawes: 
Extracting SDK.........................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

本次安装的目录为脚本所指定的默认安装的目录,后面的内核编译环境的交叉编译都是按这个安装
目录去操作,所以建议用户也是默认安装到/opt/fsl-imx-x11/4.1.15-2.1.0 这个默认目录。

使用方法也十分简单,根据上面打印出来的提示,直接使能环境变量就可以了。但是在不 同终端或者切换用户时需要重新使能环境变量方可使用

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

可以查看该文件中的内容,其中内容是导入环境变量。

dawes@ubuntu:~$ cat /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
export SDKTARGETSYSROOT=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi
export PATH=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/sbin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/sbin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-uclibc:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-musl:$PATH
export CCACHE_PATH=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-uclibc:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-imx-x11/4.1.15-2.1.0/site-config-cortexa7hf-neon-poky-linux-gnueabi
export OECORE_NATIVE_SYSROOT="/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux"
export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
export OECORE_ACLOCAL_OPTS="-I /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
unset command_not_found_handle
export CC="arm-poky-linux-gnueabi-gcc  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
export CXX="arm-poky-linux-gnueabi-g++  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
export CPP="arm-poky-linux-gnueabi-gcc -E  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
export AS="arm-poky-linux-gnueabi-as "
export LD="arm-poky-linux-gnueabi-ld  --sysroot=$SDKTARGETSYSROOT"
export GDB=arm-poky-linux-gnueabi-gdb
export STRIP=arm-poky-linux-gnueabi-strip
export RANLIB=arm-poky-linux-gnueabi-ranlib
export OBJCOPY=arm-poky-linux-gnueabi-objcopy
export OBJDUMP=arm-poky-linux-gnueabi-objdump
export AR=arm-poky-linux-gnueabi-ar
export NM=arm-poky-linux-gnueabi-nm
export M4=m4
export TARGET_PREFIX=arm-poky-linux-gnueabi-
export CONFIGURE_FLAGS="--target=arm-poky-linux-gnueabi --host=arm-poky-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="4.1.15-2.1.0"
export OECORE_SDK_VERSION="4.1.15-2.1.0"
export ARCH=arm
export CROSS_COMPILE=arm-poky-linux-gnueabi-

# Append environment subscripts
if [ -d "$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then
    for envfile in $OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do
	    . $envfile
    done
fi
if [ -d "$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then
    for envfile in $OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do
	    . $envfile
    done
fi

可以利用以下代码查看环境变量是否生效,生效的话显示如下:

dawes@ubuntu:~$ qmake -v
QMake version 3.1
Using Qt version 5.12.9 in /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib

如果重新打开一个终端的,没有source环境变量,就不会显示信息,需要重新source。

…0905继续

2.3 命令行交叉编译Qt项目

为了演示这部分,需要创建Qt程序,我在创建基于“QWidget”的程序时,报错:error: cannot find -lGL,解决方法为:cannot find -lGL问题的解决方法

2.3.1 qmake生成makefile文件

dawes@ubuntu:~/Qt/01$ ls 01/
01.pro       main.cpp        widgettest.h
01.pro.user  widgettest.cpp
dawes@ubuntu:~/Qt/01/01$ pwd
/home/dawes/Qt/01/01
dawes@ubuntu:~/Qt/01/01$ qmake
Info: creating stash file /home/dawes/Qt/01/01/.qmake.stash

当文件夹中只有一个.pro文件的时候,直接使用qmake就可以,当有多个.pro文件的时候,需要指出具体qmake哪个.pro文件,上述即为:qmake 01.pro

dawes@ubuntu:~/Qt/01/01$ ls -a
.   01.pro       main.cpp  .qmake.stash    widgettest.h
..  01.pro.user  Makefile  widgettest.cpp

此时查看目录下的文件,看到多出来了Makefile文件,如果想要把Makefile等文件删除可以使用如下操作:

dawes@ubuntu:~/Qt/01/01$ make distclean
rm -f moc_predefs.h
rm -f moc_widgettest.cpp
rm -f main.o widgettest.o moc_widgettest.o
rm -f *~ core *.core
rm -f 01 
rm -f .qmake.stash
rm -f Makefile
dawes@ubuntu:~/Qt/01/01$ ls -a
.  ..  01.pro  01.pro.user  main.cpp  widgettest.cpp  widgettest.h

2.3.2 make进行编译

dawes@ubuntu:~/Qt/01/01$ make -j 2  #使用2个线程进行编译,不能超过给虚拟机设置的核数

查看编译结果:
在这里插入图片描述
使用qmakemake指令,等效于“05【正点原子】I.MX6U出厂系统Qt交叉编译环境搭建V1.6”中对图形界面的配置与使用,其配置过程只不过就是使用图像化界面执行qmakemake指令。

以上就完成了程序的编译,后期也会使用命令行的方式进行交互。

2.4 拷贝编译好的执行程序到开发板运行

2.4.1 采用U盘拷贝的方式

没网的话可以使用U盘,插入优盘之后,其路径为:/media/,使用cp命令+sync命令同步,将可执行文件拷贝到U盘即可,将U盘插到开发板上。
以下界面从电脑桌面打开相应的板卡连接软件:
在这里插入图片描述
插入U盘之后的显示
在这里插入图片描述
改变权限,直接执行可执行文件
在这里插入图片描述
一般直接运行是不可以的,需要将默认的出厂桌面程序退出,否则不会正常显示。对于正在执行的命令,可以使用“ctrll+c”停止,退出桌面使用“killall /opt/QDesktop”,如果想要永久退出,可以在/ect/rc.local中注释掉对应的命令行即可,此处不做详细介绍。
在这里插入图片描述

退出桌面程序之后,再次./55执行可执行文件,板卡的显示屏显示如下:
在这里插入图片描述
如果想要将默认的出厂界面换成自己的,同样可以在/ect/rc.local中进行设置,前提是需要将U盘中的可执行文件,拷贝到指定的目录,假设为“/home/root”

2.4.2 推荐通过scp指令拷贝文件

首先需要有网,开发板插上了网线,连接在一个路由器或者分支路由器.
(1)查看开发板的IP
在这里插入图片描述
(2)Ubuntu的ip
在这里插入图片描述
如何拷贝,可以参考:“06【正点原子】I.MX6U开发板文件拷贝及固件更新参考手册V1.2”,其中详细介绍了不同方法拷贝可执行文件到开发板。
(3)使用scp命令,在Ubuntu系统中将可执行文件,拷贝到开发中。
关于scp命令的介绍如下:
在这里插入图片描述

scp 55 roota192.168.2.152:/home/root

在这里插入图片描述
拷贝完成之后就可以按照上面U盘拷贝的方式,执行验证。

对应地址:I.MX6U交叉编译Qt项目

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值