交叉编译说明:工具链安装和环境变量配置
目录
一 简单了解交叉编译
① 什么是交叉编译
② 为什么需要交叉编译
③ 宿主机和目标机
二 搭建交叉编译工作环境
① 安装工具链
② 配置环境变量
● 配置临时环境变量
● 配置永久环境变量
三 交叉编译宿主机和目标机
● 宿主机编译生成的可执行文件下载到目标机(开发板)
四 交叉编译带wiringPi库的程序
● 将树莓派中自带的wiringPi库下载到Ubuntu或宿主机中
五 软链接和硬链接
① 软链接
② 硬链接
六 结合四和五进行编译
一 简单了解交叉编译
① 什么是交叉编译
(1)编译:是在一个平台上生成在该平台上的可执行代码
(2)交叉编译:是在一个平台上生成另一个平台上的可执行代码。
● 我们再windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行;
● 我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行
② 为什么需要交叉编译
● 平台上不允许或不能够安装我们所需要的编译器比如C51;
● 因为目的平台上的资源贫乏,无法运行我们所需要编译器;
● 树莓派作为一款强大的开发板,同样也需要用到交叉编译。树莓派有时因为目的平台还没有建立,暂无操作系统,所以根本不能运行编译器。
● 操作系统也是代码,也要编译!
③ 宿主机和目标机
平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心。
● 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机(电脑X86)。
● 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行(树莓派ARM)。
二 搭建交叉编译工作环境
① 安装工具链
工具链下载网址:https://github.com/raspberrypi/
(1) 将下载好的工具链文件放入Windows中与Ubuntu的共享文件夹中;
(2) 打开Ubuntu,从共享文件夹拷贝到工作目录。输入命令:
cp /mnt/hgfs/share/tools-master.zip .//我的共享文件名是share
(3) 解压文件: unzip tools-master.zip
(4) 进入解压好的文件目录中,依次进入如下目录直到bin目录(64位计算机就如下选择)
cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
(5)ls进入bin目录里,找到 arm-linux-gnueabihf-gcc
(6) ls -l 查看bin目录底下各文件权限,arm-linux-gnueabihf-gcc作为软连接,实际用到的可执行程序是它后面的arm-linux-gnueabihf-gcc-4.8.3
(7)指令arm-linux-gnueabihf-gcc -v 检查交叉工具链是否是4.8.3版本
② 配置环境变量
临时:只在当前页面有效,风险性高,离开当前页面又需要重新配置;
永久:任何页面或路径下都有效,安全可靠
(1)Linux环境变量的作用和配置方法其实和Windows的环境变量一样,不一样的只有界面而已;
(2)在上面操作交叉编译工具链可以看到,要使用工具链就必须进入层层目录,繁琐且麻烦,降低开发效率;
(3)配置环境变量就能很好的解决这一问题;
● 配置临时环境变量
(1)echo $PATH :显示当前的环境变量;
(2)pwd :显示当前路径,并复制;
(3)export PATH= :配置环境变量 = 红线部分 + 当前路径
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/dhw/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
(4)回车确定,cd 回到工作目录
(5)arm-linux-gnueabihf-gcc -v :检查
● 配置永久环境变量
(1)修改工作目录下的.bashrc 隐藏文件,配置命令终端的vi /home/dhw/.bashrc 打开后在文本最后一行加入以下内容:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/dhw/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
(2)source /home/dhw/.bashrc 加载配置文件,马上生效配置。
三 交叉编译宿主机和目标机
❄检查交叉编译工具链:arm-linux-gnueabihf-gcc -v
❄在Ubuntu上编写一个简单的程序:程序的文件名为:demo1.c
● 常规编译:gcc demo1.c -o test_1。生成test_1这个可执行程序;
● 交叉编译:arm-linux-gnueabihf-gcc demo1.c -o test_2 。生成test_2这个可执行程序;
❄用file命令查看可程序test_1和test_2的属性:
● test_1在x86-64位计算机上面运行(宿主机-电脑),无法在ARM平台上运行
● test_2在ARM平台上运行(目标机-树莓派),无法在X86平台上运行
● 宿主机编译生成的可执行文件下载到目标机(开发板)
scp test_2 pi@192.168.x.xxx:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
❄ 此方法也可以将目标机文件传至宿主机
四 交叉编译带wiringPi库的程序
说明:在树莓派中编写带wiringPi库的程序时(比如IO口),直接在程序中加头文件#include <wiringPi.h>,在编译的时候-l链接wiringPi库即可,因为树莓派自带有wiringPi库,在/usr/lib目录下。在Ubuntu中或者宿主机中没有自带wiringPi的库,那么很明显无法顺利完成带wiringPi库程序的交叉编译。
● 将树莓派中自带的wiringPi库下载到Ubuntu或宿主机中
① cd /usr/lib :树莓派wiringPi库的文件路径;
② ls -l |grep wiringPi :过滤出只有wiringPi库的相关文件
③ 将软链接libwiringPi.so指向的libwiringPi.so.2.50下载到Ubuntu或宿主机中:
scp libwiringPi.so.2.50 dhw@192.168.x.x:/home/dhw/lessonPI
指令 需要拷贝的文件名 目标用户名 ip 拷贝的目标路径
注意:这里要拷贝软连接指向的文件,如果直接拷贝软链接到Ubuntu,Ubuntu里并不会生成我们要的软链接。
那么需要自己来生成软链接!具体如下:
五 软链接和硬链接
① 软链接
● 软链接文件有类似于Windows的快捷方式;
● 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息;
● 在选定的位置上生成一个文件的镜像,不会占用磁盘空间。
生成方法:
ln -s libwiringPi.so.2.50 libwiringPi.so
指令 参数 要被链接的文件 要生成的软链接文件名字
② 硬链接
● 在选定的位置上生成一个和源文件大小相同的文件;
● 硬链接通过索引节点来进行链接;在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接
● 允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放,也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
生成方法:
ln libwiringPi.so.2.50 libwiringPi.so
没有参数 -s
❄ 无论是软链接还是硬链接,文件都保持同步变化。
六 结合四和五进行编译
编译时通过-I -L来指定相关库的路径
● -I (注意是大写的i) 给gcc添加自定义的头文件的路径
● -L 给gcc添加额外的搜索库的路径
说明:将树莓中名为demo2.c的程序文件拷贝到Ubuntu中,demo2.c是需要连接wiringPi库使用的程序;-I的wiringPi库的头文件是自行网上下载的wiringPi库的包;-L的wiringPi库是树莓拷贝到Ubuntu中的 。
arm-linux-gnueabihf-gcc demo2.c -I /home/dhw/lessonPI/WiringPi/WiringPi/wiringPi -L. -lwiringPi -o test
交叉编译工具链 树莓关于IO口文件 -I wiringPi库头文件路径 -L wiringPi库
编译通过:
相关文章:
交叉编译说明:工具链安装和环境变量配置
目录 一 简单了解交叉编译 ① 什么是交叉编译 ② 为什么需要交叉编译 ③ 宿主机和目标机 二 搭建交叉编译工作环境 ① 安装工具链 ② 配置环境变量 ● 配置临时环境变量 ● 配置永久环境变量 三 交叉编译宿主机和目标机 ● 宿主机编译生成的可执行文件下载到目…...
文件上传的多种利用方式
文件上传的多种利用方式 文件上传漏洞除了可以通过绕过检测进行webshell的上传之外,还有多种其它的漏洞可以进行测试。 XSS漏洞 文件名造成的XSS 当上传任何文件时,文件名肯定是会反显示在网页上,可以使用 XSS Payload做文件名尝试将其上传到…...
盘一盘C++的类型描述符(二)
先序文章请看 盘一盘C的类型描述符(一) 稍微组合一下的复杂类型 数组指针类型的数组类型 数组的指针类型我们已经了解了,那么,以这种类型作为元素的数组类型怎么搞? using type int (*)[3]; // 元素类型是数组指针…...
慎投,Frontiers这本期刊显示on hold中
什么是“On Hold”? 该期刊因为质量问题正在被进行重新评估;在重新评估过程中,不会检索新发表的文章。该期刊因为质量问题正在被进行重新评估;在重新评估过程中,不会检索新发表的文章。根据选择标准,在最严…...
Winform控件开发(21)——ProgressBar(史上最全)
一、属性 1、Name 用于获取控件对象 2、Anchor 锚定控件对于父控件的位置 3、BackColor 背景色 4、ContextMenuStrip 关联的上下文菜单 5、Cursor 鼠标移动到控件上显示的光标 6、Dock 停靠在父控件的位置 7、Enabled 是否启动该控件,false时事件都不能触发 8、…...
校招失败后,在外包公司熬了 2 年终于进了字节跳动,竭尽全力....
其实两年前校招的时候就往字节投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里这两年除了工作以外,也会坚持写博客,也因此结识了很多优秀的小伙伴,从他们身上学到了特别…...
UniApp + SpringBoot 实现接入支付宝支付功能和退款功能
一、支付宝开放平台设置 注册支付宝支付功能需要个体工商户或企业才可以!需要有营业执照才能去申请哦! 1、登录到控制台 进入支付宝开放平台 控制台 2、开发设置 3、产品绑定APP支付 如果没有绑定APP支付就会报商家订单参数异常,请重新发起…...
初识进程
文章目录一、进程的概念1. 进程是什么及进程的管理2. Linux 下的 pcb3. 系统调用接口 getpid 和 getppid4. 系统调用接口 fork一、进程的概念 1. 进程是什么及进程的管理 在 Linux下 ./binaryfile 运行一个程序或者在 Windows下双击运行一个程序时,程序就变成了一个…...
SOAP传输协议
一.HTTP传输协议 超文本传输协议(HyperText Transfer Protocol,缩写:HTTP),它是基于请求-响应的模式协议,客户端发出请求,服务器端给出响应并返回请求内容。方法如下,HTTP传输协议常…...
<Linux>进程控制
进程控制 文章目录进程控制一、进程创建1.fork函数认识2.写时拷贝3.fork常规用法4.fork调用失败的原因二、进程终止1.进程退出场景2.进程退出码3.进程退出的方式三、进程等待1.进程等待是什么?2.进程等待的必要性3.进程等待的方法3.1.wait函数3.2.waitpid函数4.如何…...
有手就行 -- 搭建图床(PicGo+腾讯云)
🍳作者:贤蛋大眼萌,一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 ,一名很普通但不想普通的程序媛}贤蛋大眼萌,一名很普通但不想普通的程序媛🤳 🙊语录:多一些不为什么的…...
“蓝桥杯”递推和递归(一)——取数位
1. 算法简介 递推和递归虽然叫法不同,但它们的基本思想是一致的,在很多程序中,这两种算法可以通用,不同的是递推法效率更高,递归法更方便阅读。 (1)递推法 递推法是一种重要的数学方法&#…...
蓝桥杯·3月份刷题集训Day02
本篇博客旨在记录自已打卡蓝桥杯3月份刷题集训,同时会有自己的思路及代码解答希望可以给小伙伴一些帮助。本人也是算法小白,水平有限,如果文章中有什么错误之处,希望小伙伴们可以在评论区指出来,共勉💪。 文…...
python --获取内网IP地址
方法一 import socketdef get_local_ip_address():ip_address try:# 获取本机主机名hostname socket.gethostname()# 获取本机IPip_address socket.gethostbyname(hostname)except:passreturn ip_address方法二 import subprocessdef get_local_ip_address():ip_address …...
如何衡量你的Facebook广告活动的成功
投入大量资金和资源在Facebook广告上并不总能带来预期的回报,这很可能是由于缺乏恰当的衡量广告活动成功的方法。在这篇文章中,我们将介绍一些关键的指标,帮助你更好地了解如何衡量你的Facebook广告活动的成功。1.费用每次点击(CP…...
Linux对一个目录及其子目录所有文件添加权限
1、chmod指令 chmod是一个改变用户拥有指定文件的权限的命令.r:只读,w:写,x执行.也可以用数字 -rw------- (600) -- 只有属主有读写权限。 -rw-r--r-- (644) -- 只有属主有读写权限;而属组用户和其他用户只有读权限。 -rwx------ (700) -- 只有属主有读、写、执…...
宝刀未老?低代码何德何能受大厂们的推崇
风口之下,低代码蓬勃发展,本文从国内低代码的走红现象引入,浅析低代码发展中的变化趋势,重点探讨如此趋势之下,国内大厂如何通过低代码实现了良性发展。 一、国内爆火的低代码 据Gartner最新报告显示,到2…...
智能扑克牌识别软件(Python+YOLOv5深度学习模型+清新界面)
摘要:智能扑克牌识别软件利用视觉方法检测和识别日常扑克牌具体花色与数字,快速识别牌型并标注结果,帮助计算机完成扑克牌对战的前期识别步骤。本文详细介绍基于深度学习的智能扑克牌识别软件,在介绍算法原理的同时,给…...
SQL优化13连问,收藏好!
1.日常工作中,你是怎么优化SQL的? 大家可以从这几个维度回答这个问题: 分析慢查询日志 使用explain查看执行计划 索引优化 深分页优化 避免全表扫描 避免返回不必要的数据(如select具体字段而不是select*) 使用…...
【小技巧】公式从docx文件复制到doc文件变成了图片怎么办?
文章目录0、word文件后缀命名1、docx和doc默认的公式编辑方式2、MathTpye公式编辑器3、MathType 运行时错误‘53’:文件未找到:MathPage.WLL4、结束语0、word文件后缀命名 1997-2003的旧版本文件名后缀是.doc 从2007版以后,后缀名是.docx…...
Python3入门与进阶笔记(六):初识类
目录 一些解释 属性 类名建议首字母大写,通常用驼峰规则命名。变量名建议小写,下划线隔开。类最基本的作用是封装。 写在类内非方法中的语句在类加载的时候会执行,且只会执行一次,例如下面的print语句,类加载时就会…...
Prometheus监控实战系列九:主机监控
Prometheus使用各种Exporter来监控资源。Exporter可以看成是监控的agent端,它负责收集对应资源的指标,并提供接口给到Prometheus读取。不同资源的监控对应不同的Exporter,如node-exporeter、mysql-exporter、kafka-exporter等,在这…...
JVM知识整理
JVM知识整理 JVM的主要组成部分 JVM包含两个两个子系统(类加载子系统和执行引擎)和两个组件(运行时数据区与和本地库接口) 类加载子系统:根据给定的全限定类名来加载class文件到运行时数据区域中的方法区。执行引擎&a…...
【C++】二叉搜索树
A:你长大后想要做什么? B:写下“快乐”…… A:不,你理解错我的意思了,我是说 B:不,是你理解错了人生…… 文章目录一、二叉搜索树的实现1.struct TreeNode{}2.迭代版本2.1 Insert()插入结点(解决链接的问题)…...
leetcode -- 21. 合并两个有序链表
🐨目录📑1. 题目🛶2. 解法- 头插到新链表🐬2.1 思路🐬2.1 代码实现⛵3. 解法优化 - 带哨兵位🐋3.1 思路🐋3.2 代码实现🚤4. 题目链接📑1. 题目 将两个升序链表合并为一个…...
计算机组成原理|第四章(笔记)
目录第四章 存储器4.1 概述4.1.1 存储器分类4.1.2 存储器的层次结构4.2 主存储器4.2.1 概述4.2.2 半导体存储芯片简介4.2.3 随机存取存储器(RAM)4.2.4 只读存储器(ROM)4.2.5 存储器与CPU的连接4.2.6 存储器的校验4.2.7 提高访存速…...
【Unity3D-BUG记录】Unity3D中出现“动画片段必须标记为Legacy的警告”消除方法
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中可能会遇到下面的警告: The AnimationClip…...
Spring Bean的定义(含创建Bean的三种方式)
🏆 文章目标:复习和理解下Spring Bean的定义 🍀 Spring Bean的定义(含创建Bean的三种方式) ✅ 创作者:Jay… 🎉 个人主页:Jay的个人主页 🍁 展望:若本篇讲解内…...
vue的路由-vue router(一)
vue的路由-vue router一、路由的基本使用HTMLrouter-linkrouter-viewJavaScript二、带参数的动态路由匹配三、嵌套路由四. 编程式导航导航到不同的位置替换当前位置横跨历史篡改历史五. 命名路由六. 命名视图嵌套命名视图七. 重定向和别名重定向别名八. 将 props 传递给路由组件…...
DevOps流水线搭建-PHP版本
一、介绍流水线发布代码1、官网https://www.jenkins.io/zh2、kubesphere里的介绍https://kubesphere.io/zh/docs/v3.3/devops-user-guide/how-to-use/pipelines/choose-jenkins-agent/3、git仓库可以自己写点测试代码,提交,待会测试用https://gitee.com/…...
wordpress采集微博/seo整站优化方案
文章目录 前言eigen库中常用代码矩阵置0 求逆一、调用gismo细化后生成新的ele单元1.1 理论分析1.2 用一个单元的双二次曲面验证一下1.3 程序和结果二、将细化后的单元信息和节点信息代入IGA程序中遇到的问题2.1 程序bug2.1.1 数据类型一定要注意2.1.2 初始输入数据要和程序匹配…...
建设局查询网站/2022最近比较火的营销事件
1)spring对bean进行实例化,默认bean是单例 2)spring对bean进行依赖注入 3)如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法 4)如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来 5)如果bean实现了Appli…...
自己做网站怎么加定位/自助建站平台
call block拨号路由:带#的路由记得要掐头去尾的工作debug chh323 h252〉可以查看被叫/主叫debug voice dial peer inoutdebug voip ccapi inoutmgcpGW上是没有Dail-peer的,而且没有IP通信的,用的mail格式,如上图MGCP的报文是根据事件来着&…...
企业网站用户群/百度seo搜索营销新视角
为什么80%的码农都做不了架构师?>>> 有时候不想放弃jpa持久化的便利性,又不想因此牺牲了查询的灵活性,所以列举两种jpa下的灵活查询方式。 单表查询指定Entity中的部分字段 这块比较简单,只需要定义一个存放部分属性的…...
php网站优化/百度问一问官网
不能设置文件夹共享的原因看你系统的这两项服务是否是禁止掉,如果禁止掉的,把它启动后就可以设置文件夹共享了!这两项服务是Server,Computer Browser这两个服务,但要Server服务保证启动成功,才可以让Computer Browser服…...
qq云端服务器/网站优化排名首页
字符串转换整数的库函数Given a string and we have to convert it into lowercase string without using any library function. 给定一个字符串,我们必须在不使用任何库函数的情况下将其转换为小写字符串。 PHP code: PHP代码: <?php//function …...