树莓派交叉编译

目录

一、交叉编译的认知

1.1 本地编译:

1.2 交叉编译是什么:

1.3 为什么要交叉编译:

1.4 什么是宿主机?什么是目标机?

1.5 如何进行交叉编译:

二、交叉编译工具链的安装

2.1 下载交叉编译工具:

2.2 将交叉编译工具链添加到环境变量:

2.2.1 临时有效的添加环境变量:

2.2.2 永久有效的添加环境变量:

三、交叉编译实战

3.1 交叉编译实战(一):

3.2 交叉编译实战(二):

四、带WiringPi库的交叉编译实战

4.1 交叉编译WiringPi库:

4.2 把树莓派的WiringPi库拿来

4.2.1 将树莓派的libwiringPi.so.2.52上传到虚拟机:

4.2.2 创建软链接:

4.2.3 交叉编译:


一、交叉编译的认知

编译是指将源代码文件(如C/C++文件)经过预处理、编译、汇编和链接等步骤,转换为可执行文件的过程将源代码转换成机器代码的过程称为编译(Compile),编译的工作需要编译器(Complier)来完成。

1.1 本地编译:

  • 本地编译是指在当前的编译平台上,生成能在当前平台上运行的可执行文件。

例如,在x86平台上,使用 x86平台上的工具,开发针对x86平台本身的可执行程序,这个编译过程称为本地编译。 以一个简单的例子来说明本地编译,假设有一个hello.c文件,它包含以下内容:

#include <stdio.h>int main()
{printf("Hello World\n");return 0;
}

我们想要在x86平台上进行本地编译,并在x86平台上运行这个程序。可以使用以下命令:

gcc hello.c -o hello

1.2 交叉编译是什么:

  • 交叉编译 是在一个平台上生成另一个平台上的可执行代码。例如:

  1. 我们再windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行

  2. 我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行

1.3 为什么要交叉编译:

  1. 平台上不允许或不能够安装我们所需要的编译器,比如C51,因为目的平台上的资源贫乏,无法运行我们所需要编译器

  2. 树莓派比C51内存大的多,是不是就不需要交叉编译了?错,也要!树莓派有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。操作系统也是代码,也要编译!因为平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心

1.4 什么是宿主机?什么是目标机?

  • 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。

  • 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。

1.5 如何进行交叉编译:

  • 交叉编译需要用到工具,一般称作为:交叉编译器或者交叉编译工具链

二、交叉编译工具链的安装

2.1 下载交叉编译工具:

  • 我们交叉编译工具链的安装应该是在宿主机上,也就是我们的Linux虚拟机,在宿主机上编译出能在树莓派ARM平台上运行的程序

  • 树莓派交叉编译工具链下载地址:[GitHub - raspberrypi/tools](https://github.com/raspberrypi/tools)

https://github.com/raspberrypi/tools

然后把我们下载下来的压缩文件通过FileZilla上传到我们的虚拟机上面:

 然后使用下面指令解压:

unzip tools-master.zip

解压之后我们进入下面这个路径下:

进入到该路径后我们可以看到:arm-linux-gnueabihf-gcc这个软链接是指向arm-linux-gnueabihf-gcc-4.8.3的,软链接是不占内存的,作用就是指向真正的可执行程序,在使用中就可以使用软链接的名字来调用真正的可执行程序。  

 所以arm-linux-gnueabihf-gcc就是我们树莓派的交叉编译工具链,使用和gcc是一样的,比如:XXX.c,编译的语句是:

./arm-linux-gnueabihf-gcc XXX.c 	//只不过把“gcc”替换成了“./arm-linux-gnueabihf-gcc”

2.2 将交叉编译工具链添加到环境变量:

现在我们已经拥有了交叉编译工具链,我们知道我们的交叉编译工具链在下面这个路径下:

/home/shiyahao/lessonPi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

我们在编译的时候还要将这么长的路径加到我们交叉编译之前,就会让我们的编译变得非常的繁琐和麻烦,我希望我们在使用这个交叉编译工具链的时候可以像gcc那样,不管在什么路径下都可以编译,这样就得配置环境变量了

2.2.1 临时有效的添加环境变量:

临时的添加环境变量,其实在前几节学习动态库的制作时就有提到过,那就是使用export,临时的意思就是“仅在添加完环境变量后的当前窗口有效”,也就是说如果再开一个窗口就又识别不到新添加的环境变量了。

  • 使用下面指令查看当前的环境变量:

echo $PATH

这一长串中:前面的/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games: 是不变的,然后使用下面指令来添加我们新的环境变量:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:想要添加的路径
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/shiyahao/lessonPi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

运行之后我们退回到根目录下,也就是/home/shiyahao下,然后输入下面指令:

arm-linux-gnueabihf-gcc-4.8.3 -v		//-v查看编译信息

我们可以看到在其他路径下我们可以暂时使用交叉编译器了,此时我们新开一个终端窗口,再次输入arm-linux-gnueabihf-gcc -v就无法识别了,所以这个环境变量只能临时有效。

2.2.2 永久有效的添加环境变量:

临时有效虽然一句命令就能搞定,但是有风险,因为终端随时可能关闭,然后添加的临时环境变量就失效了,所以还是学习一下如何一劳永逸的修改环境变量:

  • 修改工作目录下的 .bashrc 隐藏文件(该文件用于配置命令终端的

vi /home/shiyahao/.bashrc

然后在文件的末尾添加我们的交叉编译工具链的路径:

其实,bashrc隐藏文件 就是一个脚本,永久有效的核心思路就是通过脚本自动运行export,和动态库写脚本写export的思路是一样的。

  • 然后运行下面指令,用于加载配置文件,生效配置

source /home/shiyahao/.bashrc

 此时我们再开一个新的终端,并运行arm-linux-gnueabihf-gcc-4.8.3 -v

可见,这样就永久有效的将交叉编译器的目录添加到了环境变量中去了!

三、交叉编译实战

3.1 交叉编译实战(一):

现在在我们的宿主机的根目录下有一个hello.c文件,我们通过gcc编译器编译出可以在本机X86平台上运行的程序,我们可以通过下面指令查看:

file 程序名

我们可以看到这个程序只能在X86-64平台上运行,是不能在我们的树莓派ARM平台上运行的,我们想要在我们的树莓派ARM平台上运行,我们就得用基于树莓派ARM平台的交叉编译器来编译arm-linux-gnueabihf-gcc-4.8.3

 我们看到编译出来的程序是在ARM平台上运行的,我们把它拷贝到树莓派上,指令如下:

scp hello_2 pi@192.168.31.123:/home/pi

可以看到我们交叉编译的程序成功在树莓派上运行

3.2 交叉编译实战(二):

  • 现在我们尝试把我们之前的FTP云盘项目中的客户端交叉编译到我们的树莓派上运行,我们的虚拟机运行服务器程序,让宿主机和树莓派实现FTP通信。

  • 这是我们之前的FTP云盘的项目:

    [Linux系统编程项目——FTP网盘](https://blog.csdn.net/weixin_54859557/article/details/139939604?spm=1001.2014.3001.5502)

arm-linux-gnueabihf-gcc-4.8.3 clientFTP.c -o RaspberryclientFTP		//交叉编译FTP客户端代码
file RaspberryclientFTP												//产看文件属性
scp RaspberryclientFTP pi@192.168.31.123:/home/pi					//将我们交叉编译出来的程序上传到树莓派

 可以看到我们成功的交叉编译了FTP的客户端程序,并成功在树莓派上运行,实现了宿主机和树莓派之间的FTP通信

四、带WiringPi库的交叉编译实战

在之前的交叉编译实战中,成功的将Ubuntu虚拟机上面的代码交叉编译成了能够在树莓派上运行的程序,但是之前的交叉编译代码不需要链接库,如果代码包含了WiringPi库或者线程库,那么在gcc编译时就需要链接库,对于这种需要链库的C代码进行交叉编译不能直接无脑的在“arm-linux-gnueabihf-gcc XXX.c”后加上“-lwiringPi”,其原因是库文件也是当前平台下的文件,并不能被树莓派平台所识别!

  • 首先先将我们的WiringPi库上传或者下载到我们的根目录(home/CLC)下:

  • 然后进入这个文件夹后,运行build安装:

  • /usr/local/lib/路径下就可以看到这个wiringPi的动态库:

  • 通过file指令查看文件属性:

可以看到这个动态库只能在当前平台(X86-64)上运行,是不能在我们的ARM树莓派平台上运行的,所以我们这里有两种方法:

4.1 交叉编译WiringPi库:

既然这个库文件无法被树莓派平台识别,那就先交叉编译库文件,再链库并交叉编译代码,但是对于动态库的交叉编译和之前的方法可能不同,所以这种方法暂时不展开。

4.2 把树莓派的WiringPi库拿来

4.2.1 将树莓派的libwiringPi.so.2.52上传到虚拟机:

直接把树莓派上面使用的WiringPi拿过来也可以解决我们的问题:

cd /usr/lib		//进入树莓派/usr/lib目录下
ls				//查看当前目录下的文件

然后通过file指令查看该文件的属性:

 然后通过下面指令发送到我们的虚拟机上面:

scp /usr/lib/libwiringPi.so.2.52 CLC@192.168.31.90:/home/CLC/lessonPi

4.2.2 创建软链接:

参考文章:Linux创建连接命令 ln -s创建软连接 - 张娜nana - 博客园 (cnblogs.com)

  • 软链接的概念:

  1. 软链接文件有类似于Windows的快捷方式。

  2. 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

  3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间

  • 硬链接的概念:

  1. 它会在你选定的位置上生成一个和源文件大小相同的文件

  • 硬链接如何生成:

ln libwiringPi.so.2.52 libwiringPi.so
  • 软链接如何生成:

ln -s libwiringPi.so.2.52 libwiringPi.so 
指令 参数   要被链接的文件    软链接文件名字

然后再通过file命令查看一下虚拟机的libwiringPi.so.2.52的文件属性:

确实是树莓派ARM平台上的WiringPi动态库

4.2.3 交叉编译:

现在有了树莓派ARM平台上的WiringPi库,可以尝试交叉编译带有WiringPi库的C代码了,比如下面这个代码:

#include <stdio.h>
#include <wiringPi.h>#define BEEP 7int main (void)
{wiringPiSetup () ; //初始化wiringPi库pinMode (BEEP, OUTPUT); //配置输入输出模式while(1){digitalWrite (BEEP, LOW) ;	//蜂鸣器响delay (1000) ;		// mSdigitalWrite (BEEP, HIGH) ;	//蜂鸣器不响delay (1000) ;}return 0;
}

 然后使用下面指令进行交叉编译:

arm-linux-gnueabihf-gcc beep.c -L ./ -lwiringPi -I /home/CLC/WiringPi/wiringPi -o BEEP
  • 使用“-L ”:指定动态库的优先查找目录为当前目录

  • 使用“-I”(大写i):指定头文件的优先查找目录为/home/mjm/WiringPi/wiringPi

我们在编译的时候出错了,然后重新向虚拟机导入版本2.50的wiringPi动态库,然后重新生成软链接,然后在编译就OK了

使用下面指令将交叉编译出来的BEEP程序上传到树莓派:

scp BEEP pi@192.168.31.123:/home/pi/waishe

然后在树莓派上成功运行,蜂鸣器开始了滴滴声

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/424100.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据中台与数据飞轮:如何结合两者优势推动企业数据驱动转型?

一、数据时代的双轨列车 在回答这个问题之前&#xff0c;我们可以借用交通系统来形容一下数据中台和数据飞轮。数据中台是一种集成企业内外各类数据资源&#xff0c;通过标准化处理、存储和分析&#xff0c;为前台业务提供高效数据服务支持的技术和管理体系。而数据飞轮则强调…

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…

Humanize AI 简介

Humanize AI 简介 Humanize AI 官方首页截图 文章目录 Humanize AI 简介1 Humanize AI 是什么2 Humanize AI 能做什么3 Humanize AI 怎么用4 Humanize AI 怎么收费5 结论 1 Humanize AI 是什么 数字时代的当下&#xff0c;AI 人工智能已成为内容创作不可或缺的一部分。从生成文…

第T8周:猫狗识别

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 ●难度&#xff1a;夯实基础⭐⭐ ●语言&#xff1a;Python3、TensorFlow2 要求&#xff1a; 1.了解model.train_on_batch()并运用 2.了解tqdm&#xff0c;并使用tqdm实现可视化进度条 拔高&#xff08…

clip论文阅读(Learning Transferable Visual Models From Natural Language Supervision)

目录 摘要训练pre-train model的过程将pre-train model应用于下游任务应用&#xff08;待更新&#xff09; 论文/项目地址&#xff1a;https://github.com/OpenAI/CLIP 提供了clip的pre-trained model的权重&#xff0c;也可安装使用pre-trained model 摘要 使用标签标注的图…

CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制

版本简介&#xff1a; cesium&#xff1a;1.99&#xff1b;Supermap3D&#xff1a;SuperMap iClient JavaScript 11i(2023)&#xff1b; 官方下载文档链家&#xff1a;SuperMap技术资源中心|为您提供全面的在线技术服务 示例参考&#xff1a;support.supermap.com.cn:8090/w…

SIP ACK method

SIP ACK同样在RFC3261中定义。 ACK仅仅用于对INVITE request的response的回复&#xff0c;例如在通话结束时&#xff0c;MO要断开连接&#xff0c;此时就会生成一条BYE 消息。BYE不会经过代理&#xff0c;而是直接路由到MT。MT通过200 (OK) 响应确认收到 BYE&#xff0c;然后就…

光华里社区“电亮生活”行动:智能科技携手志愿温情,老旧小区焕发新生机

在朝阳区建外街道光华里社区&#xff0c;一场关于“电”的革命正悄然改变着居民的生活面貌。面对老旧小区普遍存在的电力设施陈旧、线路老化、电压不稳等老大难问题&#xff0c;社区党委没有坐视不管&#xff0c;而是携手北京中兴物业管理有限公司广联物业管理中心党支部&#…

多核DSP(6000系列)设计与调试技巧培训

​课程介绍&#xff1a; 为帮助从事DSP开发工程师尽快将DSP技术转化为产品&#xff0c;在较短时间内掌握DSP设计技术和问题的解决方法&#xff0c;缩短产品开发周期、增强产品竞争力、节省研发经费。我们特组织了工程实践和教学经验丰富的专家连续举办了多期DSP C6000的培训&a…

RTX3060 FP64测试与猜想

RTX3060 FP64测试与猜想 一.小结二.查看FP64的峰值性能三.打满FP64、FP32的利用率,对比差异四.进一步证明pipe_fp64_cycles_active并不是2个fp64 core的metrics RTX3060 FP64测试与猜想 一.小结 RTX3060 compute capability为8.6,每个SM有2个FP64 core。每个cycle可输出2个fp6…

【SSRF漏洞】——http协议常见绕过

改变的确很难&#xff0c;但结果值得冒险 本文如有错误之处&#xff0c;还请各位师傅指正 一.ssrf概述 SSRF全称为Server-side Request Fogery,中文含义服务器端请求伪造 SSRF是一种由攻击者构造形成由目标服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标…

Centos7安装gitlab-ce(rpm安装方式)

本章教程&#xff0c;主要介绍如何在Centos7安装gitlab-ce。 一、安装基础环境 安装gitlab-ce之前&#xff0c;我们需要安装一下jdk版本。 sudo yum install java-11-openjdk-devel二、下载安装包 这里我们下载的是rpm包。更多gitlab-ce版本可以在这里查看&#xff1a;https://…

08 vue3之认识bem架构及less sass 和scoped

bem架构 他是一种css架构 oocss 实现的一种 &#xff08;面向对象css&#xff09; &#xff0c;BEM实际上是block、element、modifier的缩写&#xff0c;分别为块层、元素层、修饰符层&#xff0c;element UI 也使用的是这种架构 1. BEM架构 1. 介绍 1. BEM是Block Element M…

日志收集工具 Fluentd vs Fluent Bit 的区别

参考链接&#xff1a; FluentdFluentd BitFluentd & Fluent Bit | Fluent Bit: Official Manual Fluentd 与 Fluent Bit 两者都是生产级遥测生态系统&#xff01; 遥测数据处理可能很复杂&#xff0c;尤其是在大规模处理时。这就是创建 Fluentd 的原因。 Fluentd 不仅仅是…

计算机网络30——Linux-gdb调试命令makefile

1、开始调试 编译时带-g为调试&#xff0c;带调试信息编译后的可执行文件更大 2、进入调试 使用gdb 可执行文件名——进入调试 失败版&#xff1a; 成功版&#xff1a; 3、l命令 l什么都不加——列出10行代码 l 行号——行号的行在中间&#xff0c;向上向下展示10行 4、st…

PD虚拟机占用多少内存?使用电脑的虚拟内存会损害电脑吗

当我们讨论虚拟机及其对电脑性能的影响时&#xff0c;常常会出现两个关键问题&#xff1a;“PD虚拟机需要占用多少内存&#xff1f;”以及“启用电脑的虚拟内存是否会损害硬件&#xff1f;”对于依赖虚拟机进行日常工作的用户而言&#xff0c;这些问题尤为重要。 在本文中&…

架构设计 - 常用日志收集方案选型对比与推荐

目录 1. 常用组合1.1 ELK Stack -> Elastic Stack1.2 EFK Stack1.3 Graylog1.4 PLG 日志系统1.5 Splunk1.6 Filebeat ELK1.7 AWS CloudWatch Logs1.8 阿里云日志服务1.9 腾讯云 CLS&#xff08;日志服务&#xff09; 2. 推荐 日志收集是系统监控和调试中的关键环节。常见的…

Python 数学建模——ARMA 时间序列分析

文章目录 前言使用前提平稳性检验白噪声检验 用法代码实例第一步——平稳性分析方法一方法二方法三 第二步——白噪声分析第三步——确定参数第四步——模型构建与检验检验模型效果预测未来数据 前言 常见的时间序列分析方法有很多&#xff0c;之前介绍了一个稍微新颖的 Prophe…

vue项目如何在js文件中导入assets文件夹下图片

前言&#xff1a; 之前在vuewebpack项目中动态导入图片时&#xff0c;是使用的require()函数。但是在vite中不支持require()函数&#xff0c;换成了new URL()方式。 项目中使用&#xff1a;

HuggingFace Embedding 转为 Ollama Embedding

Ollama 是基于 LlamaCpp 开发的 CPU 上的推理引擎&#xff0c;通过 LlamaCpp 提供的脚本可以将大语言模型装换为 gguf 的二进制跟是文件&#xff0c;从而通过 Ollama 就行推理。Ollama 支持HuggingFace 大多开源模型&#xff0c;例如 Llama、Qwen、Gemma 和 Phi3 等等。 GGUF …