编译器

  • gcc编译器
  • 编译器自举
  • 动静态库
    • 动静态库的差异

gcc编译器

众所周知,代码运行的前提是经过四个步骤的

  1. 预处理,其进行宏替换,去注释,条件编译,头文件展开的工作,在gcc的选项中对应gcc -E,其就会生成预处理后的代码,正常的后缀为i,虽然Linux并不以后缀为识别文件的标准,但存在后缀会更好一些。
  2. 编译,生成汇编代码,对应gcc -S,后缀为s
  3. 汇编,生成机器可识别代码,对应gcc -c,后缀为o,虽然在汇编之后代码已经成为了二进制代码,但是仍然无法运行,因为没有进行连接,即使只有一个源文件也是需要连接的,
  4. 连接,生成可执行文件或库文件,对应gcc,即不带选项就会直接生成可执行代码。

编译器自举

众所周知后,计算机语言发展历史为

二进制
汇编语言
C语言

首先计算机是二进制的原因是二进制足够的简单,历史上出现过三进制的计算机,但也被抛进了历史的垃圾堆。
而CPU为什么能够执行二进制,编写的二进制代码其实是一个指令集,而CPU是能够识别并执行这些指令集的,每一个二进制序列都是一个命令,CPU的解码单元就是为此而生的。
那么为什么会出现后续的汇编语言再到C语言呢?
原因就是人们很难去理解二进制,所以会出现汇编语言,使得一些指令被翻译成人类可以识别的语言,比如0111(加法),在汇编中变为了add,0101(移动),在汇编中变为了mov,这样相比于人们难以理解的二进制代码变为了一个个文字,使得计算机更加的能贴近人们的生活,也让程序员能够更加便捷的去编写代码,同样C语言的诞生也是如此。
但汇编语言在其被发明的时候,计算机为什么能够执行汇编代码?难道在汇编语言被发明的时候就出现了汇编的编译器吗?并不是,而是在出现汇编语言的时候,先使用二进制去写一份汇编语言的编译器,之后在此基础上,在用汇编语言来写一份自己的编译器,此为编译器自举。

动静态库

在上述我们已经了解到在经过汇编后的二进制代码是无法被执行的,但为什么二进制代码无法被执行呢?因为编写的代码会套用很多库文件在这里插入图片描述
比如图示中的libc-2.17.so就是C标准库,如果没有进行连接将库与二进制代码连接起来,那么源代码中关于库的相关代码就无法运行。

像代码在连接过程去自己寻找标准库连接的就是动态库,如果我们将标准库复制到源代码中,此时不在经过连接就可以直接运行,这种就是静态库,但与此同时,可执行程序的体积将会扩大。当然静态库并不是直接将库给拷贝到源文件中,而是在编译时选择 -static选项,是强制要求编译器采用静态连接的方式进行编译。

动静态库的差异

如上述所说,采用动静态库的第一个差异就是可执行文件的体积差异,但如果库丢失或损坏,那么经过动态连接的程序是无法执行的,但如果是静态连接,是不受影响的,当然编译器默认都是采用动态连接动态库的,这种更高效一些。

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

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

相关文章

Three.js + AI预测:在数字孪生中实现数据可视化智能决策

某智慧工厂的数字孪生系统曾陷入尴尬:3D 模型里的生产线数据实时跳动,却没人能预判 “2 小时后哪台机器会停机”。这就像有了高清监控,却不会分析监控画面 ——Three.js 做出的可视化是 “眼睛”,AI 预测才是 “大脑”。不少团队用…

刀客doc:亚马逊持续猛攻程序化广告

文/刀客doc(头条深一度精选作者)一7月的尾声和8月的开端,广告市场见证了两场截然不同的场面。7月31日,亚马逊公布了截至6月30日的2025年第二季度财报。广告业务表现尤为亮眼:单季收入达到157亿美元,同比增长约22%,成为…

政府网站IPv6检测怎么做?检测指标有哪些?

随着信息技术的飞速发展,IPv6作为下一代互联网的核心协议,已成为全球互联网发展的必然趋势。我国政府高度重视IPv6的规模部署和应用推广,明确要求各级政府网站必须完成IPv6改造,以提升网络基础设施的现代化水平,增强网…

有N个控制点的三次B样条曲线转化为多段三阶Bezier曲线的方法

将具有N 个控制点的三次B样条曲线转换为多段三阶Bezier曲线,是计算机图形学和CAD系统中常见的操作。这种转换基于B样条曲线的局部性质以及其与Bezier曲线之间的关系。基本原理三次B样条曲线由一组控制点 P₀, P₁, ..., Pₙ₋₁ 和一个节点向量 U {u₀, u₁, ..., …

chrome好用的浏览器插件

https://ad.infread.com/?utm_sourcebaidu_sem&utm_mediumweb_pc&utm_campaignkeywords_website_translate&bd_vid2831968530895394443 目前我自己觉得比较用的谷歌浏览器翻译插件->沉浸式翻译 个人觉得无论时速度还是准确度都是比较好的

k8s---prometheus 监控

目录 环境准备 下载 kube-prometheus 软件包 下载prometheus 镜像 master节点 master节点导入prometheus软件包 解压 node节点 node节点导入镜像 解压 从tar包中加载镜像 部署 prometheus 修改映射端口 提交 查看pod pod和svc正常启动 deployment daemonset se…

华大时空组学空转图像处理

华大时空组学空转图像处理 library(png) library(tiff) st <- readRDS(01.Stereo-seq/output_all/Demo_Mouse_Kidney/outs/feature_expression/seurat_out.rds) dim(stassays$Spatialcounts) stassays$Spatialcounts[1:4,1:4] coord.df <- data.frame(imagerow st$x, im…

如何在SptingBoot项目中引入swagger生成API文档

目录 背景介绍&#xff0c;swagger的必要性 swagger的引入&#xff1a; 1.首先我们需要在 pom.xml文件中导入jar包 2.给swagger创建一个配置类&#xff1a; 3.为实体类添加注解 4.为controller添加注解 背景介绍&#xff0c;swagger的必要性 自从在2005年前端工程师诞生之…

GD32入门到实战21--输入捕获

我们新建capture_drv.c#include <stdint.h> #include <stdio.h> #include "gd32f30x.h" #include "delay.h"static void GpioInit(void) {rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_10MHZ,GPIO…

MyBatis 与 MyBatis-Plus 的对比与选择

&#x1f50d; MyBatis 与 MyBatis-Plus 的对比与选择 文章目录&#x1f50d; MyBatis 与 MyBatis-Plus 的对比与选择&#x1f9e0; 一、MyBatis 核心回顾&#x1f4a1; 核心思想与架构定位⚡ 基础使用示例⚠️ MyBatis 的痛点⚡ 二、MyBatis-Plus 功能特性解析&#x1f4a1; M…

大数据-湖仓一体

数据仓库 这是一个传统的概念了&#xff0c;趋向于结构化数据&#xff0c;简单来说就是进过数据治理后的标准数据更易于数据分析使用&#xff0c;代价就是存储比较昂贵了 数据湖 近些年来新出的一种概念&#xff0c;就是存储了结构化&#xff0c;非结构化&#xff0c;半结构…

Java视觉跟踪入门:使用OpenCV实现实时对象追踪

视觉跟踪是计算机视觉领域的一个重要分支&#xff0c;它允许我们在视频序列中持续定位移动对象。本文将介绍如何使用Java和OpenCV库来实现一个简单的视觉跟踪系统。什么是视觉跟踪&#xff1f;视觉跟踪是指通过分析视频帧来自动追踪一个或多个移动对象的过程。这项技术广泛应用…

【题解 | 两种做法】洛谷 P4208 [JSOI2008] 最小生成树计数 [矩阵树/枚举]

特别难调&#xff0c;洛谷题解区很多人代码可读性不强&#xff0c;做的我怀疑人生。 &#xff08;虽然我的码风也一般就是了&#xff09; 前置知识&#xff1a; Kruskal 求最小生成树。 题面&#xff1a; 洛谷 P4208 两种做法&#xff0c;一种矩阵树一种枚举。 &#xff08…

光谱相机多层镀膜技术如何提高透过率

光谱相机多层镀膜技术通过精密的光学设计与材料组合实现透过率提升&#xff0c;其核心原理与技术特性如下&#xff1a;一、多层镀膜的光学优化机制‌复合相位调控‌ 通过交替沉积高折射率&#xff08;如TiO₂, n2.3&#xff09;与低折射率材料&#xff08;如SiO₂, n1.46&#…

ubantu安装配置hive

在Ubuntu系统上安装Hive通常涉及几个步骤&#xff0c;包括安装Java&#xff08;因为Hive依赖于Java&#xff09;&#xff0c;安装Hadoop&#xff0c;然后安装Hive本身。以下是一个基本的步骤指南&#xff1a; 安装Java 首先&#xff0c;确保你的系统上安装了Java。你可以通过运…

大模型RAG项目实战:文本向量模型>Embedding模型、Reranker模型以及ColBERT模型

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

基于uni-app的校园综合服务平台开发实战

闪递校园&#xff1a;基于uni-app的校园综合服务平台开发实战作为一名全栈开发者&#xff0c;我用6个月时间开发了这款校园综合服务平台——闪递校园。本文将详细分享项目从0到1的开发经验&#xff0c;包括技术选型、核心功能实现、踩坑记录以及性能优化等方面的干货内容。&…

Qt::Q_INIT_RESOURCE用法

q_init_resource 用法 q_init_resource 是 Qt 框架中用于初始化嵌入式资源的一个函数。它通常用于将编译到应用程序二进制文件中的资源&#xff08;如图像、QML文件、翻译文件等&#xff09;注册到Qt的资源系统中。 基本用法 cpp Q_INIT_RESOURCE(resourcename); 其中 resource…

【开题答辩全过程】以 基于php的校园兼职求职网站为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

安卓悬浮球-3566-测试报告

安卓悬浮球-3566-测试报告 测试概述 项目名称: 悬浮球电子秤应用 测试版本: v1.0.0 测试时间: 2025年9月 测试环境: UniApp开发环境 测试类型: 功能测试、性能测试、兼容性测试 测试结果: 见附件测试环境配置 硬件环境 测试设备: Android 内置3566屏幕分辨率: 1080x1920内存: 2…