政安晨的个人主页:政安晨
欢迎 👍点赞✍评论⭐收藏
收录专栏: 嵌入式机器学习开发实战
希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!
在ARM-Linux系统中,C语言程序的安装和运行可以按照以下步骤进行:
-
准备交叉编译工具链:由于ARM-Linux系统的体系结构和常规x86体系结构有所不同,我们需要使用特定的交叉编译工具链来编译ARM架构的C语言程序。可以在官方网站或者第三方开发者社区下载合适的交叉编译工具链。
-
编写C语言程序:使用文本编辑器编写C语言程序源代码,并保存为以.c为后缀的文件。
3.使用交叉编译工具链编译程序:打开终端,并使用交叉编译工具链中的编译器(一般为arm-linux-gcc)将C语言程序源代码编译成可执行文件。
例如,使用以下命令编译程序:
arm-linux-gcc -o program program.c
这将会生成名为program的可执行文件。
4.将可执行文件传输到ARM-Linux系统:将生成的可执行文件传输到运行ARM-Linux系统的设备上,可以使用文件传输工具(如scp)或者通过网络进行传输。
5. 在ARM-Linux系统中运行程序:使用命令行终端进入到可执行文件所在的目录,并使用以下命令运行程序:
./program
C语言程序就会在ARM-Linux系统上运行,并输出相应的结果。
需要注意的是,ARM-Linux系统中的C语言程序可能需要特定的库文件或者其他依赖项,如果程序无法正常运行,可能需要安装相应的库文件或者解决依赖关系。
程序的安装
程序的运行过程,其实就是处理器根据PC寄存器中的地址,从内存中不断取指令、翻译指令和执行指令的过程。
内存RAM的优点是支持随机读写,因此可以支持CPU随机读取指令;
内存的缺陷是RAM属于易失性存储器,一旦断电,内存中原先保存的数据都会消失。
现代计算机的存储系统一般采用ROM+RAM的组合形式:ROM中存储的数据断电后不会消失,常用来保存程序的指令和数据,但ROM不支持随机存取,因此程序运行时,会首先将指令和数据从ROM加载到RAM,然后CPU到RAM中取指令就可以了。
程序安装的本质
软件安装的过程其实就是将一个可执行文件安装到ROM的过程。
你下载的软件安装包里包含了可以在计算机上运行的可执行文件,软件开发者为了方便用户使用,将可执行文件、程序运行时需要的动态共享库、安装使用文档等打包压缩,生成可运行的自解压安装包格式。
使用安装包安装软件就是将包中的可执行文件解压出来,然后将可执行文件和动态共享库复制到指定的安装目录,并把这些安装信息告诉操作系统。
当用户要运行这个软件时,操作系统就会从安装目录找到这个可执行文件,把它加载到内存执行。无论是在Linux环境还是在Windows环境,基本上都是遵循这个套路,只不过实现的方式不同而已。
在Linux环境下,我们一般将可执行文件直接复制到系统的官方路径/bin、/sbin、/usr/bin下,程序运行时直接从这些系统默认的路径下去查找可执行文件,将其加载到内存运行。
接下来我们就做一个实验,分别在Linux和Windows环境下制作一个软件安装包,并分别安装运行。这个软件很简单,就是一个helloworld程序。
第一次看到这里的小伙伴,请参考这篇文章安装编译环境:
【嵌入式机器学习开发实战】(八)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的编译过程】https://blog.csdn.net/snowdenkeke/article/details/136805174比如:
sudo apt install gcc-arm-linux-gnueabihf
sudo apt install vim
现在我们准备一个简单的C语言Hello world程序(我们就将文件命名为main.c):
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
在ARM-Linux环境下,我们可以使用gcc命令将其编译为一个可执行文件:a.out。完成这一步后,我们就可以给这个可执行文件制作软件安装包。
在ARM-Linux目标机上(我这里就是用的树莓派开发板),创建一个文件夹,并编译出可执行文件。
编译:
arm-linux-gnueabihf-gcc -o hello.out main.c
值得注意的是,我这里使用的是服务器版本,已经安装了gcc,所以我的执行如下:
可以看到第二行中打印出了hello world!
此时,验证可以后,咱们就可以在ARM-Linux环境下制作软件安装包了。
在Linux下制作软件安装包
Linux操作系统一般可分为两派:Redhat系和Debian系。Redhat系使用RPM包管理机制,而Debian系,像Debian、Ubuntu等操作系统则使用deb包管理机制。
我们在Linux环境下安装软件其实就是将可执行文件复制到环境变量PATH对应的官方路径下面:
常用的路径有/bin、/sbin、/usr/bin、/usr/local/bin等。
当我们在Shell终端输入命令时,Shell就会到这些默认路径下去找与该命令相对应的二进制文件,并加载到内存执行。
一个成熟的发布软件里,除了可执行文件,一般还会有配套的文档说明、图标等,程序开发者将这些文档一起打包发布,提供自动安装的功能,更方便用户下载和安装。在制作deb包时,除了可执行文件,还需要一些控制信息来描述这个安装包,如软件的版本、作者、安装包要安装的路径等,这些控制信息放在一个叫作control的文件里。
下面我们就写一个简单的helloworld程序,并为它制作一个deb包。
编译获得可执行文件后(.out),我这里没有使用后缀(不是必须的),我这里的文件名为hello:
创建一个hello同名目录,然后进入该目录,分别创建DEBIAN、usr/local/bin/目录,并在DEBIAN目录下创建control文件,将可执行文件helloworld复制到usr/local/bin/目录下,操作完成后helloworld的目录结构如下所示。
DEBIAN目录下的control文件用来记录helloworld安装包的安装信息,我们可以通过编辑这个文件来配置相关安装信息。
package:hello
version:1.0
architecture:i386
maintainer:wit
description: deb package demo
另外一个目录usr/local/bin/表示deb包的默认安装路径。
这两个文件归位后,我们就可以使用dpkg命令来制作安装包。
dpkg -b hello/ hello_1.9_i386.deb
如果命令运行无误,就会在hello的同级目录下,生成一个名为hello_1.0_i386.deb的安装包。
接下来我们使用dpkg命令安装这个deb包,来验证一下我们制作的安装包是否正常。
安装如下:
dpkg -i hello_1.9_i386.deb
安装成功后:在系统的/usr/local/bin下就会看到安装成功的hello可执行文件。
安装成功后,在Shell终端的任何目录下,直接输入hello命令都可以直接运行。当然,也可以通过dpkg命令卸载hello程序。
这就是您要知道的全部内容了,先了解即可。这些知识仅仅是为咱们后续真正的嵌入式机器学习体系的开发打些基础而已。