ARM_Linux的交叉开发以及交叉编译器

目录

为什么要使用交叉开发

为什么要使用交叉编译

交叉编译器的安装

交叉编译器的使用


为什么要使用交叉开发

交叉开发是指在通用的电脑上吧程序编写,编译,调试好,再下载到嵌入式产品中去运行,对于一些简单的程序的话,直接在电脑上编译调试好即可,但是对于一些需要操作硬件的开发(例如GPIO)在电脑上调试是没有意义的。

  • 大多数嵌入式产品只有运行环境,没有开发环境且性能没有PC机强

  • 通用PC开发软件更加丰富,环境更加舒适、安全。

  • 所开发的程序通过编译器编译成可执行文件,在放到嵌入式产品当中进行运行

为什么要使用交叉编译

1、首先我们知道计算机只识别二进制,所以我们编写的程序如果要在计算机上运行是需要进行编译的,编译就编译器将程序翻译成二进制的过程。

2、在ubuntux系统下使用gcc或者g++编译器生成可执行程序只能在ubuntu系统下,并且只能在x86架构的CPU上运行。

写一个简单的例程:在ubuntu下新建一个.c文件写一个helloworld的程序

cpp 复制代码
#include <stdio.h>

int main(void)
{
		printf("Hello, world!\n");
	return 0;
}

第一行gcc编译器对test1.c编译生成test1

我们可以使用file 命令查看编译生成的可执行文件。

因为咱的电脑一般都是X86架构的但是咱的开发板是ARM架构的不同的CPU所支持的指令集不同,一个.c文件在编译的时候会生成.s的汇编文件,在汇编文件里会生成不同的指令集(gcc编译过程会在下一篇文章里),所以在ubuntu系统下使用gcc 或者 g++编译生成的可执行程序不能运行在ARM平台上。

3、如果程序需要运行在ARM平台上,我们需要在ubuntu系统下使用专门的编译器对源代码进行编译,然后再将编译好的可执行程序拷贝(这个拷贝就可以使用上篇文章说到的NFS挂载的文件中)到ARM平台上运行,这个过程我们就叫做交叉编译。同样这个专门的编译器编译的程序也不能在虚拟机上运行。

4、问题:直接在ARM平台上使用专用的编译器编译这样是不是也可以呢?还省去了需要将程序从PC机器上拷贝到开发板上?

答:理论上是可以的!!但是因为ARM平台的资源(性能)与PC机相差太多,如果在ARM平台上运行编程程序速度较慢

交叉编译器的安装

不同厂家的板子提供的交叉编译器是不一样的但是安装方式都差不多类似

开发板主要是由硬件ARM内核的芯+软件, ·软件里边运行着一个linux内核的系统,在进行嵌入式开发的过程中这种linux内核都是定制的,结合硬件等实际情况从linux内核上裁剪,进行一些驱动的开发,最后再把文件系统烧写到芯片当中,所以不同公司提供的交叉编译器的安装版本可能是不一样的。我的虚拟机是使用韦东山老师的ubuntu18根据他的资料文档下载BSP的时候下载了交叉编译在该板子上只需要设置环境即可使用交叉编译器。

下边是

1、将"板商提供的用户资料"->"工具"->".sh"等类似的sh文件拷贝到虚拟机的共享目录下。

2、在虚拟机中进入到共享目录下,然后执行如下命令安装交叉编译器:

sudo ./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh

//fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh这只是一个列子版本

3、交叉编译器安装成功后会自动在/opt目录下创建目录:

/opt/fsl-imx-x11/4.1.15-2.0.0

4、编译器目录介绍:在 "/opt/fsl-imx-x11/4.1.15-2.0.0"目录下输入ls命令查看目录下得文件

a) "environment-setup-cortexa7hf-neon-poky-linux-gnueabi"是一个脚本文件,其功能是设置交叉编译器相关的一些环境变量(后面再讲解该文件内的内容)

b) "sysroots"目录下存放的是编译器相关的文件

c) 输入"cd sysroots"命令,进入到"sysroots" 目录,然后输入"ls"命令查看目录下的文件:

d) "cortexa7hf-neon-poky-linux-gnueabi"目录存放的是编译器工作需要依赖的文件,例如库文件、头文件等

e) "x86_64-pokysdk-linux" 目录存放交叉编译器,输入"cd x86_64-pokysdk-linux"进入该目录下

f) 输入"cd usr/bin/arm-poky-linux-gnueabi/"命令进入到交叉编译器文件存放目录

g)上图中的文件便是一些交叉编译器,"arm-poky-linux-gnueabi-g++"就是用来编译.cpp文件的,"arm-poky-linux-gnueabi-gcc"是用来编译 .c 文件的。

在韦东山的im6ull_Pro中使用的是"arm-buildroot-linux-gnueabihf-gcc"进行编译的。

以上只是讲述了一种安装方式。

交叉编译器的使用

在使用之前要先配置环境变量,也就是编译器的路径,让ubuntu直到编译器在哪在~/.bashrc进行修改(永久生效),

cpp 复制代码
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueab
ihf_sdk-buildroot/bin

注意该路径PATH的路径应为你自己对应开发板的交叉编译器的路径的bin文件+。

CROSS_COMPILE=对应开发板的交叉编译器

if是上边安装过程中的版本则:

CROSS_COMPILE=arm-poky-linux-gnueabi-

环境添加好之后就可以进行编译了,编译效果如下:

将交叉编译器编译完的可执行程序拷贝到NFS挂载的目录下,在开发板中执行

chmod +x arm_test1 //添加可执行的权限

./arm_test1

即可

相关推荐
我言秋日胜春朝★30 分钟前
【Linux】进程地址空间
linux·运维·服务器
C-cat.1 小时前
Linux|环境变量
linux·运维·服务器
yunfanleo1 小时前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker
糖豆豆今天也要努力鸭2 小时前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
烦躁的大鼻嘎2 小时前
【Linux】深入理解GCC/G++编译流程及库文件管理
linux·运维·服务器
ac.char2 小时前
在 Ubuntu 上安装 Yarn 环境
linux·运维·服务器·ubuntu
敲上瘾2 小时前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
长弓聊编程2 小时前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.2 小时前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒3 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生