【交叉编译】

news2024/11/29 2:48:32

一、什么是交叉编译
二、为什么要交叉编译?
三、交叉编译要用到的工具(工具链、交叉编译器)
四、交叉编译工具链的安装
五、配置环境变量
六、交叉编译工具编译
七、带wiringPi库的交叉编译如何进行
八、软链接、硬链接
九、Linux创建链接命令 ln -s创建软链接
在这里插入图片描述

一、什么是交叉编译

交叉编译(cross compilation)是指在一种体系结构的计算机上生成另一种体系结构的可执行程序。这通常用于嵌入式系统、移动设备和其他资源受限的环境,其中目标平台与主机平台不同。

以下是交叉编译的一般步骤:

  1. 获取交叉编译工具链: 你需要下载适用于目标平台的交叉编译工具链。这个工具链包含了编译器、链接器和其他必要的工具,使你能够在主机上生成目标平台的可执行文件。通常,工具链的名称包含目标体系结构的信息,例如arm-linux-gnueabi

  2. 设置环境变量: 在使用交叉编译工具链之前,你需要设置一些环境变量,以确保编译器和其他工具正确地识别目标平台。例如,你可能需要设置PATHCC(C编译器)、CXX(C++编译器)等环境变量。

    export PATH=/path/to/cross-compiler/bin:$PATH
    export CC=arm-linux-gnueabi-gcc
    export CXX=arm-linux-gnueabi-g++
    
  3. 配置项目: 修改项目的配置,以便使用交叉编译工具链。这通常涉及到使用./configure脚本或CMake等工具,并指定交叉编译工具链的路径。

    ./configure --host=arm-linux-gnueabi
    
  4. 编译: 运行make命令,开始使用交叉编译工具链编译项目。

    make
    
  5. 生成可执行文件: 在编译完成后,你将得到目标平台上运行的可执行文件。

  6. 传输到目标平台: 将生成的可执行文件传输到目标平台上,可以使用scp、FTP等方式。

  7. 在目标平台上运行: 在目标平台上运行你的程序,确保它能够正确工作。

这是一个简单的概述。具体的步骤可能会根据项目和工具链的不同而有所调整。

交叉编译

交叉编译可以理解为:在当前编译平台上生成另一个目标平台上可执行代码,但是编译平台本身却不能运行该程序。
比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

本地编译

是指编译源代码的平台执行源代码编译后程序的平台同一个平台

二、为什么要交叉编译?

交叉编译是指在一种操作系统上为另一种操作系统或架构生成可执行文件或库。以下是一些常见的原因和情景,为什么要使用交叉编译:

  1. 目标平台与开发平台不同: 当目标设备或平台与开发设备的架构或操作系统不同时,需要使用交叉编译。例如,在开发者的主机上使用 x86 架构和 Linux 操作系统进行开发,但目标设备是 ARM 架构的嵌入式设备,这就需要使用 ARM 架构的交叉编译工具链。

  2. 资源受限的嵌入式设备: 在嵌入式系统中,设备可能具有有限的计算资源,包括处理能力和内存。在这些情况下,使用嵌入式设备上的本地编译可能会非常慢,而使用更强大的开发主机进行交叉编译能够提高效率。

  3. 平台独立的开发: 有时,为了确保软件在多个平台上都能运行,开发者可能会选择使用交叉编译,以便生成适用于不同平台的二进制文件。

  4. 固定目标环境: 在一些情况下,特别是在嵌入式系统和嵌入式 Linux 中,目标环境可能是一个固定的硬件平台。使用交叉编译工具链可以更好地优化生成的二进制文件以适应目标硬件的特定需求。

  5. 系统软件开发: 在操作系统或底层系统软件的开发中,可能需要与特定架构或平台进行交互,这就需要使用交叉编译工具链。

总的来说,交叉编译是为了适应不同的硬件架构或操作系统,以确保软件能够在目标设备上正确运行。

(1) 交叉编译的目标系统一般都是内存较小、显示设备简陋甚至没有,没有能力在其上进行本地编译,无法运行我们所需要编译器

(2) 有能力进行源代码编译的平台CPU架构或操作系统与目标平台不同

平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心

要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。
如:在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。

三、交叉编译要用到的工具(工具链、交叉编译器)

在进行交叉编译时,通常需要使用一组特定于目标平台的工具。以下是一些常见的交叉编译工具:

  1. 交叉编译工具链: 包括交叉编译器(例如,arm-linux-gnueabi-gcc)、交叉汇编器(as)、交叉链接器(ld)等。这个工具链是特定于目标体系结构和操作系统的。

  2. 交叉编译的标准库: 在目标平台上运行的程序通常需要与目标平台的标准库进行链接。因此,交叉编译通常需要目标平台的 C 库、动态链接库等。

  3. 交叉调试器: 用于在目标平台上调试交叉编译生成的程序。例如,GDB(GNU Debugger)的交叉调试器版本。

  4. 交叉工具: 这包括一些辅助工具,例如 objcopy(用于从可执行文件中提取特定部分)、strip(用于删除可执行文件中的符号信息,减小文件大小)等。

  5. 构建工具: 为了简化交叉编译过程,构建工具如CMake和Autotools可能需要特定的配置,以支持交叉编译目标。

  6. 交叉目标文件系统: 如果您的应用程序依赖于目标平台上的文件系统,可能需要使用交叉编译的文件系统。

这些工具通常作为交叉编译工具链的一部分提供,可以通过交叉编译工具的发行版或硬件供应商的提供的工具链来获取。确保选择与目标平台和体系结构兼容的工具。

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

  • OrangePi_Zero2交叉编译工具链安装
    详情参考OrangePi_Zero2用户手册Orange Pi Zero2-Orange Pi官网-香橙派(Orange Pi)开发板,开源硬件,开源软件,开源芯片,电脑键盘

  • 树莓派交叉编译工具链安装
    下载地址:https://github.com/raspberrypi/tools
    在这里插入图片描述

  • 解压

cp /mnt/hgfs/Share/tools-master.zip ./

unzip tools-master.zip  解压
 
cd /home/tan/raspberryPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

//gcc-linaro-arm-linux-gnueabihf-raspbian     32位
//gcc-linaro-arm-linux-gnueabihf-raspbian-x64 64位

arm-linux-gnueabihf-gcc ->arm-linux-gnueabihf-gcc-4.8.3

arm-linux-gnueabihf-gcc 是一个用于 ARM 架构的交叉编译器的符号链接。通常,这个链接会指向特定版本的编译器二进制文件,例如 arm-linux-gnueabihf-gcc-4.8.3

在交叉编译器的命名约定中,arm-linux-gnueabihf 表示了目标架构和操作系统(ARM,Linux,GNU 工具链,硬浮点支持)。而 gcc 后面的版本号,如 4.8.3,表示编译器的版本。

通过创建符号链接,例如 arm-linux-gnueabihf-gcc,可以使用户在使用交叉编译器时更加灵活。如果您的系统中有多个版本的交叉编译器,使用符号链接可以简化切换和配置。

如果需要确切知道 arm-linux-gnueabihf-gcc 符号链接指向哪个版本的编译器,可以使用 readlink 命令来查看链接目标。例如:

readlink -f $(which arm-linux-gnueabihf-gcc)

这将返回符号链接的实际目标文件的完整路径。

echo $PATH 获得当前环境变量的值
pwd获得当前路径

五、配置环境变量

1. 临时有效,配置环境变量

PATH 环境变量

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tan/raspberryPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

2. 永久有效,配置环境变量,要改配置文件

修改工作目录下的 .bashrc 隐藏文件,配置命令终端

vi /home/tan/.bashrc 

在文件最后一行加入:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tan/raspberryPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
source /home/tan/.bashrc 加载配置文件,马上生效配置。

六、交叉编译工具编译

file命令

file 命令用于确定文件类型。在终端中,你可以使用 file 命令并提供文件名或路径来获取文件的详细信息。例如:

file your_file

这将输出有关给定文件的信息,包括文件类型、编码方式、是否为文本文件等。
在这里插入图片描述
在这里插入图片描述

cannot execute binary file:Exec format error
无法执行二进制文件:Exec 格式错误

检查下交叉编译工具对不对:

arm-linux-gnueabihf-gcc -v
4.8.3

编译:

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

把编译生成的可执行文件下载到开发板:

scp your_file pi@192.168.1.145:/home/pi
指令  文件名  开发板用户名@开发板IP:开发板的工作目录

七、带wiringPi库的交叉编译如何进行

PinnedWiringPi
masterWiringPi

  1. 正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。

  2. 通过-I -L来指定

arm-linux-gnueabihf-gcc demo.c -I /home/tan/raspberryPI/WiringPi/wiringPi -L. -lwiringPi

把树莓派的wringPI库拿上来用

scp libwiringPi.so.2.50 tan@192.168.1.145:/home/tan/raspberryPI/
ln -s libwiringPi.so.2.50 libwiringPi.so
指令 参数   要被链接的文件    软链接文件名字

八、软链接、硬链接

软链接(Symbolic Link)和硬链接(Hard Link)都是用来创建文件系统中的链接的概念,但它们有一些区别。

  1. 软链接(Symbolic Link):

    • 软链接是一个独立的文件,它包含了指向目标文件或目录的路径。
    • 创建软链接使用 ln -s 命令,例如:ln -s /path/to/target link_name
    • 软链接可以跨文件系统,并且可以链接到目录。
    • 软链接可以指向不存在的目标。
  2. 硬链接(Hard Link):

    • 硬链接是目录项(文件名)的不同名称,它们都指向同一个 inode 号的文件。
    • 硬链接使用 ln 命令,例如:ln /path/to/target link_name
    • 硬链接只能在同一文件系统中创建,不能链接到目录。
    • 硬链接不能指向目录,并且不能链接到不存在的文件。

总的来说,软链接更加灵活,但是它们需要额外的空间来存储路径信息。硬链接更加节省空间,因为它们共享相同的 inode,但是在使用上有一些限制。

【硬链接】
硬链接指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种链接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。
【软链接】
另外一种链接称之为符号链接(Symbolic Link),也叫软链接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

九、Linux创建链接命令 ln -s创建软链接

ln -s 是linux中一个非常重要命令,一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s

具体用法是:ln -s 源文件 目标文件。

当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下
用ln命令链接
(link)它就可以,不必重复的占用磁盘空间。例如:ln -s /bin/less /usr/local/bin/less

-s 是代号(symbolic)的意思。

这 里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接 和硬链接
两种,软链接就是
ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还
是硬链接,文件都保持同步变化。

软链接:

  • 概念:
    1. 软链接文件有类似于Windows的快捷方式。
    2. 在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
    3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间

如何生成软链接:

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

硬链接:ln libwiringPi.so.2.50 libwiringPi.so
它会在你选定的位置上生成一个和源文件大小相同的文件

无论是软链接还是硬链接,文件都保持同步变化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs+vue+ElementUi牙科诊所信息化系统

该系统将采用B/S结构模式,前端部分主要使用html、css、JavaScript等技术,使用Vue和ElementUI框架搭建前端页面,后端部分将使用Nodejs来搭建服务器,并使用MySQL建立后台数据系统,通过axios完成前后端的交互,…

认识异常 ---java

目录 一. 异常的概念 二. 异常的体系结构 三. 异常的分类 三. 异常的处理 3.1 异常的抛出throw 3.2. 异常声明throws 3.3 捕获并处理try-catch finally 3.4异常的处理流程 四. 自定义异常类 一. 异常的概念 在 Java 中,将程序执行过程中发生的不正常行为称为…

CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏

Problem P24. [算法课贪心] 跳跃游戏 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标。 输入 输入一行数组nums 输出 输出true/fasle 样例 标准输入 2 3 1 …

出海风潮:中国母婴品牌征服国际市场的机遇与挑战!

近年来,中国母婴品牌在国内市场蓬勃发展的同时,也逐渐将目光投向国际市场。这一趋势不仅受益于中国经济的崛起,还得益于全球市场对高质量母婴产品的不断需求。然而,面对国际市场的机遇,中国母婴品牌同样面临着一系列挑…

Myblog02-基于ssm,springboot的改进

目录 一、项目概述: 应用技术: 接口实现: 数据库建表,sql脚本: 页面展示:登陆页面 项目源码:myblog01: 初版的个人博客项目-使用基本的javaWeb (gitee.com) 二、对博客系统进行测试 总结…

深入分析爬虫中time.sleep和Request的并发影响

背景介绍 在编写Python爬虫程序时,我们经常会遇到需要控制爬取速度以及处理并发请求的情况。本文将深入探讨Python爬虫中使用time.sleep()和请求对象时可能出现的并发影响,并提供解决方案。 time.sleep()介绍 首先,让我们来了解一下time.s…

【发布小程序配置服务器域名,不配置发布之后访问就会报错request:fail url not in domain list】

小程序在本地开发的时候大家通常会在微信开发者工具中设置“不校验合法域名、web-view (业务域名)、TLS 版本以及HTTPS证书”,久而久之可能会忘掉这个操作,然后打包直接上线发布,结果发现访问会报错request:fail url not in domain list&…

CETN03 - The Evolution of Computers

文章目录 I. IntroductionII. First Modern Digital Computer: ENIAC (1946)III. First Generation ComputerIV. Second Generation ComputerV. Third Generation ComputerVI. Fourth Generation ComputerVII. ConclusionI. 引言II. 第一台现代数字计算机:ENIAC&…

自定义 el-select 和 el-input 样式

文章目录 需求分析el-select 样式el-input 样式el-table 样式 需求 自定义 选择框的下拉框的样式和输入框 分析 el-select 样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更…

C++ 12.5作业

以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员&…

库函数qsort的使用及利用冒泡排序模拟实现qsort

文章目录 🚀前言🚀void*类型指针🚀库函数qsort的使用🚀利用冒泡排序实现库函数qsort() 🚀前言 今天阿辉将为大家介绍库函数qsort的使用,还包括利用冒泡排序模拟实现qsort以及void*类型的指针,关…

云祺副本容灾机制讲解

副本,顾名思义就是一份数据的拷贝。 在系统中,将数据的目的分为了三种:备份、副本和归档。 其中备份数据,通常是存放在备份系统本地,或数据中心本地;副本数据通过是存放在异地的备份系统中,或…

【C语言】【堆排序实现TOPK问题】写一个堆排序,并且在一百万个数中找出最大的前K个

1.堆排序的实现: 如果要升序输出,则实现大堆 如果要降序输出,则实现小堆 逻辑:(升序输出) 将堆顶的元素和最后一个元素交换位置,此时左子树和右子树分别仍是大堆的顺序,交换位置后…

车企数据治理实践案例,实现数据生产、消费的闭环链路 | 数字化标杆

随着业务飞速发展,某汽车制造企业业务系统数量、复杂度和数据量都在呈几何级数的上涨,这就对于企业IT能力和IT架构模式的要求越来越高。加之企业大力发展数字化营销、新能源车等业务,希望通过持续优化客户体验,创造可持续发展的数…

leetcode:统计感冒序列的数目【数学题:组合数含逆元模版】

1. 题目截图 2.题目分析 需要把其分为多个段进行填充 长为k的段,从两端往中间填充的方案数有2 ** (k - 1)种 组合数就是选哪几个数填哪几个段即可 3.组合数含逆元模版 MOD 1_000_000_007 MX 100_000# 组合数模板 fac [0] * MX fac[0] 1 for i in range(1, MX…

一个完整的转录组分析流程

本期的教程代码(部分) #!/bin/bash # # 使用fastq-dump解压sra数据 # 本数据集为双端数据 # 解压格式为fq.gz for i in SRR6929571 SRR6929572 SRR6929573 SRR6929574 SRR6929577 SRR6929578; do pfastq-dump --split-files --threads 20 --gzip -s 00_…

综合指南:如何创建有效的知识地图?

知识地图是知识管理中的重要工具,使企业能够有效地利用其资产。它促进了解决问题、新人整合和组织学习。此外,它还提高了生产力,实现了数据驱动的决策,并优化了流程。通过捕获和组织有价值的知识资产,它确保了专业知识…

如何通过nvm安装多版本nodejs?如果nodejs安装成功,但npm安装失败怎么办?

我们在开发项目的时候,最开始,是只有一个老的项目,老项目单独安装了node版本4.4.7,后来有了新项目,由于有两个项目,但是一个需要老一些版本的node,一个需要新版本的node,因此需要在两…

签名应用APP分发平台的微服务化部署是什么?其有哪些优势?

在信息技术的世界里,软件开发和部署的模式不断演进。从单体架构到服务化,再到今日备受瞩目的微服务架构。微服务化部署作为一种新兴的软件架构风格,正被越来越多的企业采用。它使得应用可以被分解成一套相互独立的最小服务单元。而“分发平台…

数据结构与算法编程题39

数组A[]中有 n 个整数,没有次序,数组从下标1开始存储,请写出顺序查找任一元素k的算法 ,若查找成功,则返回元素在数组中的位置;若查找不成功,则返回 0。 /*数组A[]中有 n 个整数,没有…