一个例子了解交叉编译

学习嵌入式Linux经常听到交叉编译这个名词,那到底什么是交叉编译,下面通过一个例子来介绍。
首先新建一个C文件,其代码如下。

#include "stdio.h"
void main()
{
    
    
    int a,b;
    int c;
    printf("请输入两个数:\n");
    scanf("%d%d",&a,&b);
    c=a+b;
    printf("a+b=%d\n",c);
}

这是一个很简单的C代码,下面通过GCC编译器先编译它,然后执行,结果如下图所示。
在这里插入图片描述
这个例子就是在X86架构的PC上新建了一个C文件并通过GCC编译器生成了一个在X86架构的PC上可以运行的可执行文件。
通过file命令查看这个可执行文件依赖的架构是X86,也就是说,这个可执行文件在X86架构下才能正确的执行。
在这里插入图片描述


接下来,如果我想在开发板上运行上面的文件,那么该怎么办呢?由于开发板是ARM架构的,而GCC编译器只能生成在X86架构上运行的可执行文件,因此要想在开发板上运行这个文件,就得在X86架构的PC上通过其他编译器生成可以在ARM架构下可以执行的文件。
首先下载安装交叉编译器,常用的Linaro GCC编译器下载:点此跳转
在这里插入图片描述
下载上面的交叉编译器后解压,然后修改环境变量,环境变量在/etc下的profile文件里修改,切换到root在该文件的最后添加下面的路径。
在这里插入图片描述
注意上面划红线的部分是我交叉编译器解压后的存放路径,你存放在哪替换就行,然后保存该文件退出,重启系统,交叉编译器就安装成功了。
使用交叉编译器之前还需要安装一下其它的库,使用到的命令如下。

sudo apt-get install lsb-core lib32stdc++6

查看交叉编译器的版本号如下图所示,说明安装成功了。
在这里插入图片描述


有了交叉编译器,就可以在X86架构的PC上生成可以在ARM架构上运行的可执行文件了,使用下面的指令实现这一功能。

arm-linux-gnueabihf-gcc a.c -o a_arm

指令中,arm表示这是编译arm架构代码的编译器,linux表示运行在linux环境下,gnueabihf表示嵌入式二进制接口,gcc表示编译工具。
使用上面的命令生成可执行文件后,在PC上运行后显示格式错误,如下图所示。
在这里插入图片描述
查看一下其可以运行的架构是ARM,如上图所示。
接下来把这个由交叉编译器生成的可执行文件通过网口连接发送到开发板,如下图所示。
在这里插入图片描述
为了验证,我把X86的可执行文件也一并发送到了开发板,执行的结果如下图所示。
在这里插入图片描述
可以看到,通过交叉编译器编译的可执行文件在开发板上成功的运行了,而通过GCC编译器编译的可执行文件在运行时也出现了格式错误。
看到这里相信大家看明白了什么是交叉编译,就是在一个架构上编译另外一个架构的代码。

猜你喜欢

转载自blog.csdn.net/weixin_42570192/article/details/132864381
今日推荐