Linux|软件开发的基础概念|软件的源码本地编译和交叉编译概念

news2024/11/13 9:17:56

前言:

本文主要讲述软件的源码本地编译和交叉编译的基本概念,首先,是介绍什么是本地编译,什么是交叉编译,其次,本地编译和交叉编译到底是有什么用处,最后是交叉编译和本地编译的具体应用场景

一、

什么是编译?本地编译?交叉编译

在硅基世界里,也就是我们的计算机世界内,由于历史的原因,有非常多的繁杂的操作系统,比如debian,fedoras,redhat,windows,macos, VxWorks 和 QNX,FreeRTOS、 uC / OS,等等,在软件方面主要体现的是操作系统的种类非常多

以下是一些可以基于RISC-V架构的操作系统:

Linux:Linux内核已经适配了RISC-V架构,因此可以在RISC-V处理器上运行Linux操作系统。这意味着许多流行的Linux发行版(如Ubuntu、Debian和Fedora)也可以在RISC-V上使用。

FreeBSD:FreeBSD是另一个流行的开源操作系统,它也支持RISC-V架构。这意味着你可以在RISC-V处理器上运行FreeBSD操作系统。

OpenBSD:OpenBSD是一个注重安全性的操作系统,它也已经支持RISC-V架构。如果你关注系统安全性,OpenBSD可能是一个不错的选择。

Debian GNU/Linux:Debian GNU/Linux也适配了RISC-V架构,因此你可以在RISC-V处理器上使用Debian发行版。

而在硬件方面,主要的体现是繁杂的硬件种类,比如,cpu的架构就有很多种类

x86:是当前主流的处理器架构,常见于 intel 和 AMD 的处理器中,支持 32 位和 64 位操作系统。

ARM:常见于大部分移动设备和嵌入式系统,也有部分主流的服务器和个人电脑采用 ARM 处理器架构,支持 32 位和 64 位操作系统。

MIPS:常见于家用路由器、智能电视、智能家居等嵌入式设备,主要支持 32 位操作系统。

PowerPC:IBM 公司开发的处理器架构,主要在高性能计算机、服务器等领域使用,支持 32 位和 64 位操作系统。

SPARC:Oracle 公司开发的处理器架构,主要在服务器等领域使用,支持 32 位和 64 位操作系统。

RISC-V:开源 RISC-V 的处理器架构正在逐渐发展壮大,被认为是未来的处理器发展方向之一

硬件和软件操作系统搭配组合成了我们常用的各种电脑,比如,桌面服务器通常是x86_64架构的cpu+centos(redhat) 这样的组合,笔记本电脑通常是x86_64架构的cpu+Windows7,10,11这样的组合,手机端的通常是arm架构的cpu(RISC-V架构的cpu)+Android11这样的组合,ATM机则通常使用x86-64架构的cpu+winxp,还有非常多的嵌入式设备,使用的硬件cpu架构和操作系统也是种类非常多的,每一个都不尽然相同

面对如此复杂的局面,我们的软件就需要做各种各样的适配,例如,微信需要适配后,也就是重新编译后,才可以在鸿蒙系统顺利运行,同样的,有些基础软件只能通过编译来进行升级,例如openssl,但编译有一个明显的优点:一处编译,随处运行 也就是在一个服务器上成功编译后,编译产出物移植到其它的服务器上,并不需要再次编译,可以直接运行

欧克,这样的本地编译很显然是不能跨平台的,例如,win+arm架构,编译产出物并不能在win+x86架构下正常运行,那么,此时就需要交叉编译了,比如,在win+x86架构下编译产出win+arm架构可用的软件,此时的编译就是交叉编译。

‌‌交叉编译:

是指在一个平台上生成另一个平台上的可执行代码。具体来说,交叉编译是在一个平台上编译生成在另一个平台上运行的可执行程序。这种编译方式常见于‌嵌入式系统和‌跨平台开发中,因为不同的体系结构有不同的指令系统,不同的‌cpu需要相应的编译器。交叉编译的作用类似于翻译,将相同的程序代码翻译成不同CPU对应的可执行二进制文件。

为什么会需要使用交叉编译呢?

比如,一个很简单的场景:某品牌的手机需要更新某个常用app,很明显,开发和测试环境在手机内部并不容易实现本地的编译,而如果我们在一个任意的常用的架构平台下开发,编译并通过详细的测试,测试好可用在手机的app,并通过合适的渠道发布出去(比如手机应用商店),那么,一个手机app的更新周期就算完成了

这里很明显的,交叉编译是专为跨平台的软件部署安装或者升级而采用的技术

二、

一般编译的大体不变的流程

1、从官网下载需要编译的目标软件源码

比如,各种Linux的内核源码,或者比如openssl的源码,通常编译工作都是升级软件,因此,需要下载符合自身需求的源码的版本

2、确定编译方式

选择一种自己比较熟悉的编译方式,比如本地编译或者交叉编译。如果能本地编译,自然是最好的,因为本地编译效率高,不太容易出错,例如,某个软件需要在arm架构服务器运行,直接找一个arm架构的服务器,在其上按下面的步骤编译完成就可以立刻使用了;交叉编译也就是需要在arm架构服务器运行的软件,在x86_64 服务器上编译,然后编译产出物移植,不仅步骤繁琐,而且编译环境搭建十分困难,稍有不慎就会失败

3、编译环境的搭建

通常编译环境指的是能够是编译工作正常运行的环境,比如c语言的源码包,肯定是需要安装相应的c语言编译器,通常是gcc和gcc-c++而go语言的源码包通常需要go语言编译器

4、开始预编译

通常源码包都会提供编译配置脚本文件,一般名称为configure或者Configure,基本上90%的源码包都是采用这种形式,但有些源码包是使用cmake编译器直接编译

直接执行预编译脚本,也就是 ./configure 就可以默认编译,该过程主要是检查编译环境,检查编译过程需要的C语言库,类,头文件等等,并模拟预测正式编译,按照一般惯例,预编译阶段需要完全通过才可以进行下一步,并且一般需要通过不断的试错法调试预编译,直至该阶段工作完全通过

5、正式编译

通常执行命令为make 或者make -j 内核数 多线程加速编译,和预编译的关系是承上启下的关系,但可能还会检查一些环境,如果预编译成功,90%概率会直接通过,但可能会由于环境检查,发现依赖缺少而失败

6、编译安装

通常执行命令为make install  ,此步骤是编译产出物,也是最终阶段,如果预编译和正式编译都通过的话,此阶段必定能够成功完成

7、编译产出物移植

例如,有两台配置基本相同的两个服务器,在A服务器上编译完成,生成了编译产出物后,将所有编译产出物复制到B服务器上后,就可以直接运行了,此时,通常不需要重复安装部署A服务器的编译环境这些,至多可能会出现缺少依赖库的问题,简单的处理一下就可以正常运行了

一般 4  5  6 步骤也简称为编译三连,以上基本是本地编译的流程

三、

交叉编译的流程

交叉编译需要工具链,主要工作是配置目标服务器的编译环境,然后在编译的时候,选择使用工具链

工具链比较复杂,一般是有现成的工具链,比如,Linaro Releases  该公司专注于工具链的制作,或者可以自己制作工具链来进行交叉编译

什么是交叉编译工具链
内核不同就需要交叉编译,在一个平台上生成另一个平台上的可执行代码。

在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,在目标平台进行编译很难实现,因为编译工具链需要很大的存储空间,而且需要很强的CPU运算能力,为了解决这个问题,交叉编译工具就诞生了。

通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。

🆗,现在以编译个hello world为例,说明交叉编译

目标:在这个x86虚拟机上,编译hello world,最终hello world可以在arm平台下正常运行

1、交叉编译工具链下载

在Linaro Releases 这个网站下载

gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz,然后将此压缩包在x86服务器上解压待用

2、配置环境变量

我是在root目录下解压,因此环境变量配置如下:

export PATH=$PATH:gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/

这一行写在/etc/profile 这个文件的末尾就可以了,然后激活环境变量 ,source /etc/profile 即可

可以查看aarch64-gcc的版本来确认该环境变量是否正确:

[root@localhost ~]# aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/root/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.3.1/lto-wrapper
Target: aarch64-linux-gnu
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/snapshots/gcc.git~linaro-7.3-2018.05/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701] (Linaro GCC 7.3-2018.05) 

3、

hello world的源码

创建名为HelloWorld.c的c语言源码,内容如下

 cat HelloWorld.c
#include<stdio.h>
int main()
{
    printf("hello world!\n");
}

4、

在x86服务器下编译这个HelloWorld.c文件

aarch64-linux-gnu-gcc HelloWorld.c -o HelloWorld

以上编译执行完毕后,会看到一个名为HelloWorld的文件,查看该文件属性,可以看到是aarch64的

[root@localhost ~]# file HelloWorld
HelloWorld: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.7.0, BuildID[sha1]=f9542f0847727ed5d58bcd53799e405ee2941185, not stripped

在x86服务器上,该文件不可执行,因为是arm架构的程序嘛

[root@localhost ~]# ./HelloWorld 
-bash: ./HelloWorld: cannot execute binary file

 

 

5、

测试

将HelloWorld 这个文件传送到arm架构服务器上就可以正常输出helloworld了

🆗,一个简单的交叉编译就完成了

后续将就如何在x86架构编译新版本的arm架构的openssl和openssh做一个实践记录

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

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

相关文章

边听边打?不再是难题,4款音频转文字神器推荐

无论是会议记录、课堂笔记还是采访录音&#xff0c;能快速准确地转录成文本&#xff0c;那可是大大提高了工作效率。市面上有几款工具在这方面做得不错&#xff0c;比如365在线转文字、布谷鸟配音、腾讯云语音识别和Speechnotes。今天就来个大比拼&#xff0c;看看它们各自的表…

人机交互的频率、时长、周期

人机交互的频率是指用户与系统互动的频繁程度&#xff1b;时长是每次互动的持续时间&#xff1b;周期是指在特定时间段内进行互动的规律或间隔。人机交互的频率、时长和周期通常与以下因素有关&#xff1a; &#xff08;1&#xff09;任务复杂性&#xff1a;复杂任务需要更多的…

docker部署clickhouse

1. 创建相关配置目录 mkdir -P /data/clickhouse/data mkdir -P /data/clickhouse/conf mkdir -P /data/clickhouse/log 2. 拉取镜像 # 下载最新版本clickhouse docker pull clickhouse/clickhouse-server # 下载指定版本clickhouse docker pull clickhouse/clickhouse…

电商数据分析:如何抓住关键指标提高销售额

在电商运营中&#xff0c;数据分析是不可或缺的一环。通过精准的数据分析&#xff0c;商家可以更好地了解市场动态、优化运营策略&#xff0c;从而提升销售业绩。然而&#xff0c;很多运营者在面对海量数据时常常无从下手。那么&#xff0c;电商运营到底该如何进行数据分析&…

Chapter 05 计算属性

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、基础语法二、计算属性vs方法三、完整写法 前言 Vue.js 提供了丰富的功能&#xff0c;帮助开发者高效地构建用户界面。本篇文章详细讲解了其计算属性的基本语法、应用…

笔记整理—uboot启动过程(7)malloc初始化与内存环境变量

上一章说到了env环境变量并对前两章有关init_sequence部分做了总结&#xff0c;这一章将要对uboot部分的malloc初始化以及内存环境变量进行相关的说明。 mem_malloc_init是用于初始化uboot堆管理器的。自己维护了一段内存&#xff0c;就可用进行malloc和free的操作了。那么这个…

Mac/Linux系统matplotlib中文支持问题

背景 matplotlib是python中最常用的数据可视化分析工具&#xff0c;Mac和Linux系统无中文字体&#xff0c;不支持中文显示&#xff08;希望后续可以改进&#xff09;&#xff0c;需要进行字体的下载和设置才能解决。笔者经过实践&#xff0c;发现Mac系统和Linux系统解决方案略…

数据结构算法基础-单链表的新建(头插法、尾插法)

1.头插法 2.尾插法 3.代码及运行结果 设输入的值为&#xff1a;3 4 5 6 7&#xff08;到9999终止读值&#xff09; #include <stdio.h> #include <stdlib.h> typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next; }LNode,*LinkList;LinkL…

02 vue3之ref全局桶

ref 接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个 .value property&#xff0c;指向该内部值。 <template><div class"">Ref:{{ name.a }}</div><button click"change()">change</button> </te…

如何用Java构建学生档案管理系统:实现学生信息的高效管理

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Mybatis缓存、java反射(精简秒懂版)

目录 一、缓存 1.mybatis一级缓存 2.mybatis二级缓存 开启二级缓存 二、Java反射机制概念 1.Java反射概念 2.Java反射相关api 三、Java反射相关类 1.Class类&#xff08;反射基础&#xff09; &#xff08;1&#xff09;Object类中的getClass方法&#xff1a;适用于通过对…

sdk监控平台

监控平台实现方案 监测网页加载时长是关注的是以下5个过程&#xff1a; 1.重定向时间&#xff1a;获取此网页前重定向所花费的时间 2.DNS域名查找时间&#xff1a;查找此网页的DNS所花费的时间 3.TCP服务器连接时间&#xff1a;用户连接到您的服务器所需的时间 4.服务器响应…

基于文心智能体平台打造的德语学习助手

德语学习助手&#xff1a;您的智能德语语言学专家 在学习德语的道路上&#xff0c;是否曾遇到过这样的困扰&#xff1a;不知道自己的德语水平如何&#xff1f;学习过程中缺乏系统的计划&#xff1f;在日常交流中总是担心表达不准确&#xff1f;或者在面对德语文本时&#xff0c…

[深度学习] 时间序列分析工具TSLiB库使用指北

TSLiB是一个为深度学习时间序列分析量身打造的开源仓库。它提供了多种深度时间序列模型的统一实现&#xff0c;方便研究人员评估现有模型或开发定制模型。TSLiB涵盖了长时预测&#xff08;Long-term forecasting&#xff09;、短时预测&#xff08;Short-term forecasting&…

【力扣】划分为k个相等的子集

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定一个整数数组 …

Learn OpenGL In Qt之系列简介

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Learn OpenGL In Qt 文章目录 传送门写在前面为什么是OpenGL和Qt能学到什么能做点什么国漫女神炫酷进度冷酷机器人 传送门 待更新 写在前面 本博客系列将带领读…

Vue——初识vue

目录 1.浏览器控制台报错 2.Vue入门 3.Vue模版语法 4.数据绑定 5.el与data的两种写法 总结 本系列属于纯干货系列&#xff0c;我们也不多说&#xff0c;直接上干货。 1.浏览器控制台报错 GET http://127.0.0.1:5500/favicon.ico 404 (Not Found) 具体如下图 这是为什么…

自己动手写CPU_step5_移动指令

移动操作指令 define EXE_MOVN 6b001011 //不等于0转移 if rt ! 0 then rs -> rd define EXE_MOVZ 6b001010 //等于0转移 if rt 0 then rs -> rd define EXE_MFHI 6b010000 // hi -> rd define EXE_MFLO 6b010010 // lo…

一步迅速了解Spring框架的几个特点

一&#xff0c;特点1&#xff1a;IOC(控制反转) 1&#xff0c;IOC是什么 反转控制”(Inverse of Control) 不是什么技术&#xff0c;而是一种设计思想&#xff0c;就是将原本在程序中手动创建对象的控制权&#xff0c;交由 Spring 框架来管理 2&#xff0c;IOC的作用 IOC 容器…

tensor core实现矩阵乘法的详细解读

之前关于tensor core的介绍可以参考链接添加链接描述 基础的tensor core实现C=AB的代码可以参考下面这段内容: 上面代码的几个注意事项: 首先是加载mma.h头文件,这个是包含wmma模板类的头文件。 其次是设置的WMMA_M=16,WMMA_N=16,WMMA_K=8,这三个参数的表示的意思是,对于…