简单易学的ARM Linux交叉编译入门指南 (arm linux交叉编译)

随着物联网时代的到来,越来越多的嵌入式设备需要使用ARM处理器来支持各种功能。而针对ARM处理器的嵌入式Linux也因此日益增多。那么,如何在自己的PC机上编译能够运行在ARM处理器上的应用程序呢?本文将为大家介绍一些。

一、交叉编译的概念

交叉编译是指在一个计算机架构下编译出在另一种计算机架构上运行的程序。由于不同架构的CPU指令集不同,在源代码完成后,在本机上直接编译运行是无法在其他架构的CPU上运行的。

二、所需工具

Linux开发环境:本文以Ubuntu 16.04 LTS操作系统为例。

交叉编译工具:本文以arm-linux-gnueabihf为例。

目标开发板:本文以树莓派3B开发板为例,此开发板使用BCM2837芯片,内置ARM Cortex-A53处理器。

三、配置环境

1.添加交叉编译工具的路径

在~/.bashrc文件中添加以下语句:

export PATH=$PATH:/usr/local/arm/arm-linux-gnueabihf/bin

2.安装相关库

使用以下命令进行安装:

sudo apt-get install libncurses5-dev

sudo apt-get install gcc-arm-linux-gnueabihf

3.构建目标文件系统

从网络上下载树莓派官方的Raspbian系统,使用以下命令进行解压:

sudo dd bs=4M if=Downloads/2023-04-08-raspbian-stretch-full.img of=/dev/sdb conv=fsync

其中,/dev/sdb表示你的SD卡设备。注意:该命令会清空SD卡上的所有数据,请确认后再操作。

4.编写源代码

编写一段简单的c程序,例如:

#include

int mn()

{

printf(“Hello World!\n”);

return 0;

}

5.编译源代码

使用以下命令进行编译:

arm-linux-gnueabihf-gcc test.c -o test

6.传输文件

使用以下命令将生成的test文件传输至目标板:

scp test pi@192.168.1.105:/home/pi

其中,192.168.1.105为目标板的IP地址,pi为目标板的用户名。

7.在目标板执行程序

在目标板上执行以下命令:

./test

如能输出”Hello World!”,则说明交叉编译成功。

四、常用交叉编译选项

1.使用-D选项生成预处理输出文件

arm-linux-gnueabihf-gcc -DDEBUG test.c -o test

2.使用-l选项连接共享库

arm-linux-gnueabihf-gcc test.c -o test -lncurses

3.使用-I选项指定头文件目录

arm-linux-gnueabihf-gcc test.c -I/usr/local/arm/ncurses/include/ -o test

五、小结

相关问题拓展阅读:

  • arm-linux-gcc交叉编译器的制作,以及版本选择问题。

arm-linux-gcc交叉编译器的制作,以及版本选择问题。

,需要必须有足够动经验来支持。

另外,用 RH9 的都是高手,我想你的知识不需要来提问了吧?

1、在 PC 上编译 arm 的程序当然需要较差编译器,这个需要自己安装,或者着现成的交叉编译器环境,一般是一个特殊参数编译出来的 gcc + binutils + glibc + linux-header。这个每个人动环境不同,一般都需要自己编译一个,当然没有特殊需求,也可以找现成的。不过很难找,因为这套环境还要和你动系统搭配,不然环境不匹配,连这个环境都不能运行,那就更谈不上编译东西了。

有关自己编译搭建交叉编译环境,可以看看一个特殊的 Linux 发行版 LFS 的分支: CLFS 。

2、移植分很多意思,移植有可能就意味着这套源代码不能在目标系统上面编译,需要你根据相应的知识去修改源代码来让这套代码适应目标编译器的要求,比如源代码有 SSE4 的优化,这套程序在非 SSE4 CPU 上无法编译运行,但目标机器连 SSE1 都不支持。那么就需要移植。

或者移植仅仅是根据新的环境进行编译,不需要进行源代码修改,只需要进行一下编译就能运行的程序,也可以称为移植,就是从一个环境、架构 -》另一个环境、架构。都可以称为移植,但真正的移植意味着修改程序源代码来适应新环境。你说的这种移植是最简单的移植。

3、决定目标硬件环境 -》搭建目标编译器 -》制作目标环境(内核,基础软件库)-》进行应用移植(移植需要的软件、主应用程序)-》搭建系统文件系统 -》导入目标系统-》启动目标系统&应用。说起来很简单,因为这是完全没有问题的条件下。

至于超级终端。那是用来控制目标系统的。目标系统有可能不能插键盘鼠标显示器,这就需要一个远程网络链接来进行控制。以及通过远程链接来发送数据。这都需要终端的支持。

虚拟机下面进行开发,不能发挥你的计算机的性能。而且因为隔着 VMware 的软件模拟层,可能还不会很方便的让你链接目标设备。

至于用 socket ,我还没见到你的目标需要这个东西,因为所有的东西都是现成的源代码。不需要你从 0 开始写,当然你想自己写一个系统内核,或者服务器程序,或者的系统+应用,我绝对不拦你,但希望你写完这套东西,能把源代码发布出来。

ads 可以认为是一个支持环境,他本身不是一个系统的开发 SDK 。

ads 没用过,印象里他还有模拟器,调试器什么的程序。功能上要比 Linux 开发环境,WinCE 环境下面的东西更多更偏向于硬件方面,毕竟 ads 是 arm 出品的,不太可能偏向于软件部分设计。Linux 和 WinCE 都是系统而不是硬件工具。

你可以认为交叉编译器是一个应用程序,一个输出器。把源代码输出为 arm 的代码,这个应用程序的输出,是靠他自己的环境,而不是当前系统的环境的。

当前系统的各个软件的版本,不能影响交叉编译器输出的环境(理论上,现实有的时候总是从别的地方给你打击……),交叉编译器一般至少有 gcc 、binutils 、glibc 库、linux kernel 头文件。

在软件需求上。

头文件谁都不依赖,glibc 只需要内核头文件,其他程序全都依赖于 glibc 。也就是所有程序都不依赖内核,仅仅是依赖于内核头文件。

gcc 和 binutils 是把程序源代码根据上面各个环节的需提供的功能来输出为上面环节里面的二进制程序。依赖你当前环境的,只有 gcc 和 binutils 两个程序的执行、控制环节。只有他们两个依赖的,而不是你的交叉编译后的程序。

至于编译器版本的选择,新版本功能更好,旧版本兼容更好。

这个要看你的实际需要了。应用程序源代码也调编译器的,同时也依赖于软件库的功能。

arm 开发建议稳定、兼容优先。当然也可以尝试最新的编译环境,来获取更好的优化(前提是还有什么代码优化的话)。

另外,团IDC网上有许多产品团购,便宜有口碑

arm-linux-gcc-3.4.5我一直在用,之前3.3.2只能编译2.6的内核,不能编译bootloader,4.3.3关于内核,和bootloader限制不大了,都可以编译

关于arm linux交叉编译的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《简单易学的ARM Linux交叉编译入门指南 (arm linux交叉编译)》
文章链接:https://zhuji.vsping.com/53601.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。