编译到底是在干什么

编译器和链接器 从程序的内存布局和编译运行的全过程来看,编译器和链接器各自扮演着不可或缺的角色,并且它们的作用既有相似之处,也存在显著差异。 阅读详情

编译到底是在干什么

写c++都知道,写完程序要编译才能形成可执行文件,那么,编译到底是在干一件什么样的事呢?

编译的例子

写一个简单的helloworld.cpp程序

#include<iostream>
using namespace std;
int main()
{
        cout<<"hello world!\n";
}

然后执行g++进行编译并运行:

[root@VM-238-167-centos /]# g++ -o helloworld helloworld.cpp
[root@VM-238-167-centos /]# ./helloworld 
hello world!

实际上,执行g++ -o这个命令,是进行了非常多的步骤的,包括预处理、编译、汇编、链接

编译与链接

在这里插入图片描述

预处理

预处理过程主要是处理那些以#开头的预编译指令,包括#include或者#define

可以执行g++ -E生成预处理后的文件,后缀为-i

g++ -E  helloworld.cpp -o helloworld.i

查看生成的-i就可以知道将头文件等进行了预编译展开

主要过程如下:

  • 将所有的#define删除,并展开所有的宏定义
  • 处理所有条件预编译指令,包括#if、#ifdef、#else等
  • 处理#include预编译指令,将被包含的文件插入到预编译指令的位置(递归进行)
  • 过滤注释
  • 添加行号和文件名标识
  • 保留所有的#pragma指令

故如果想查看对应的宏编译是否正确展开时,可以查看预编译后的文件

编译与汇编

编译的过程是进行词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件。

g++ -S helloworld.i -o helloworld.s

执行后查看该文件可以知道已经产生了对应的汇编文件:
在这里插入图片描述

整个编译过程,就是将高级语言翻译为机器语言的过程:通常将其分为6步,包括扫描、词法分析、语义分析、源代码优化、代码生成、目标代码优化。
在这里插入图片描述

编译完成后生成了汇编代码,然后编译器将汇编代码转化为机器码,即产生二进制文件

链接

链接的主要任务是将编译好的各个模块进行一个组合,使得各个模块之间能够进行正确衔接。链接的过程主要是:地址和空间的重分配、符号决议、重定位等步骤。

链接分为静态链接和动态链接:

  • 静态链接:对函数库的链接是放在编译时完成的,所有相关的目标文件与牵涉到的函数库被链接合成到一个可执行文件,故函数执行时与库函数再无瓜葛,所有需要的函数都复制到了相关的位置。也就是说,静态链接将所有用到的函数全部链接到exe文件中
  • 动态链接:把对库函数的链接载入推迟到程序运行时期。在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。

相比之下,静态链接库和动态链接库的特点:

  • 动态链接库更有利于进程间的资源共享
  • 动态链接库让程序的升级变得简单。静态库的升级必须重新编译,而动态库的话只要提供给程序的接口没变,则直接用新生成的动态库替代静态库就行
  • 动态链接库更加节省内存
  • 由于静态库在编译时就将库函数装载到程序中了,动态库是运行时装载,因此用静态库程序运行时速度可能快一些
条件编译的作用 我们可以用它区隔一些与特定头文件、程序库和其他文件版本有关的代码 立即下载

相关推荐

西门子S7-1200 PLC与伺服电机控制实战解析

工业自动化控制系统中,PLC(可编程逻辑控制器)与伺服电机的协同工作是实现精密运动控制的核心技术。通过PROFINET工业以太网协议,PLC可以高效地控制多台伺服电机,实现定位、同步和插补等复杂运动。在实际工程应用中,硬件组态的正确配置和运动控制算法的优化是关键挑战。本文以西门子S7-1200 PLC控制五台伺服电机的项目为例,详细介绍了从硬件组态、运动控制程序实现到HMI界面设计的全流程。特别针对多轴同步插补运动、动态速度曲线调整等特殊工艺需求,提供了实用的解决方案和调试技巧,为工业自动化领域的工程师提供

weixin_30252709的博客 497

初学C语言

初学C语言的概念知识点

Mr.浮华的博客 2415

如何让Arduino IDE支持你手里的STM32 nucleo开发板

Arduino IDE开发环境在默认情况下不支持STM32 NUCLEO开发板,只有通过添加附加开发板管理包才能使用。目前为止,只有一部分板子支持使用Arduino IDE开发环境进行开发,分别是 Nucleo F207ZG, Nucleo F429ZI, Nucleo F030R8, Nucleo F091RC, Nucleo F103RB, Nucleo F303RE, Nucl...

mzw72188552的专栏 8972

程序为什么要编译?编译器起到了什么作用呢?

问题描述:程序为什么要编译?编译器起到了什么作用呢?翻译作业,编译的原因跟冯诺依曼体系有关。问题解答:编译是将高级编程语言(如C++、Java等)编写的源代码转换为机器代码(也称为目标代码或可执行代码)的过程。机器代码是计算机硬件可以直接执行的二进制指令。

weixin_43501408的博客 2788

superpowers-中文使用说明

《obra/superpowers:AI辅助开发的流程纪律工具集》 摘要:obra/superpowers是一套面向AI辅助软件开发的系统化流程规范,包含14个核心技能,强调"先理解后行动"的纪律性开发方法。该工具集定义了从头脑风暴到代码评审的完整工作流,要求严格遵循测试驱动开发、子代理隔离执行等原则。核心特色包括:1) 任何实现前必须完成设计和评审;2) 采用红-绿-重构的TDD循环;3) 复杂任务通过独立子代理串行处理;4) 所有产出需经过双重验证(规格合规+代码质量)。该工具集特别注重文档化和可验证性

qq_22786633的博客 767

高通camera驱动 camx read xml 和 probe 流程 和 sensor I2C读写的波形图 (三)

Camx 刚接触的时候对于这个xml 一脸懵逼,实际上和mm-camera差不多就是以xml node节点的方式标准化了driver相关的code,exposure 和 gain的逻辑实现还是在同级目录的cpp中,并且将 xml 的解析工作放在了 out/target/<product>/gen/STATIC_LIBERARIES/libcamxgenerated_intermediates/generated/ 中主要是包含了: g_chromatix : tuning 相关xml的解析co

shangbolei的博客 1万+

浅谈编译原理

  一个源文件到可执行文件这中间编译器到底做了什么呢?请看下面: 一个源文件(.c)在编译器经过编译和链接两个大的过程而生成可执行文件(.exe),而编译又分为分为三个阶段:预处理(预编译)、编译、汇编,这是一个翻译的过程。而可执行文件生成在运行环境可以直接运行。下面是程序编译的过程。 ●组成一个程序的每一个源文件通过编译过程生成目标代码。 ●每个目标文件由连接器捆绑在一起,形成一个单...

HanSion.Z 2675

华为模拟器eNSP练习题 - HCIA综合实验

华为模拟器eNSP练习题 - HCIA综合实验 题目要求 ISP路由器只能配置IP地址,之后不得进行其他任何配置; 整个内部网络基于192.168.1.0/24进行地址规划; R1/R2之间启动OSPF协议,单区域; PC1-PC4自动获取IP地址; PC1不能telnet R1,PC1外的其他内网pc可以; PC1-PC4可以访问PC5,R2的公网接口只拥有一个公有IP12.0.0.1; 外部的client可以通过域名www.ensp.com访问http server; ISP路由telnet 12.0

炸鸡店老板z的博客 9880

c语言编译作用,叙述 C语言编译

@(C语言)[code]用一段简单的代码,探讨下从C代码到最终可执行文件的编译过程,追根究底。偶尔了解下底层,也就没那么多莫名其妙了。工作原因有时候会用python写写测试工具,感受到其快速实现应用的便利,但由于偏底层开发,主力语言依然是C。对于开发语言没有什么优劣概念,在特定的情景下哪种实现更佳就用哪种,工具合适才是最好的。个人开发环境 ubuntu 14.04编译的作用相比python,lua...

weixin_34784025的博客 1480

业态即战场:零售平台的生意模型与系统设计解构

在这篇文章中,我们从“控货、自营、联营”三种典型零售业态出发,拆解了亚马逊、阿里、京东和本地闪购平台在商品模型设计上的差异与博弈。看似简单的卖货方式背后,其实是平台在“控货权”“商品归属权”上的深层策略博弈:谁掌控商品,谁就掌控数据、流量与利润分配权。本文尝试用一套通俗但不失专业的方式,帮助产品经理和技术伙伴读懂零售平台商品模型的底层逻辑与系统设计演化路径。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

机器学习实战4-教育领域:学生成绩的可视化分析与成绩预测-详细分析

大家好,我是微学AI,今天给大家带来机器学习实战4-学生成绩的可视化分析与成绩预测,机器学习在教育中的应用具有很大的潜力,特别是在学生成绩的可视化分析与成绩预测方面。机器学习可以通过对学生的父母教育情况和学校表现等数据进行分析和挖掘,从而揭示潜在的学习模式和趋势。

微学AI的博客 7679

C编译器是干什么用的呢?

问题描述:C编译器是干什么用的呢?问题解答:C 编译器用于将 C 语言源代码编译成可执行的机器代码,以便计算机能够理解和执行。

weixin_43501408的博客 974

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

vc编译器,你在干什么?

   学习编译原理。我们了解了很多关于高级语言转换为低级语言的变化过程。其中编译可能对我们之前编写的程序进行了优化,这是我们不知道的。下面,看看微软的编译器,是怎么工作的。那么我们就可以更了解一个文件存放形式,和他原来的源代码的差别。当然有人可以通过了解这些汇编,得到一部分的源代码。进入修改程序得到自己想要的结果。这个可以通过软件来实现,那么我们要明白其中的道理还是要回归到我们的原理出发点

jhui163的专栏 1044

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c语言编译器作用,c语言的编译器是干什么用的

本人不才,仅就个人意见谈谈:1。什么是编译器:简单的说,编译器是一种将高级语言经过其解释,翻译成可以运行的二进制代码(有可能是汇编代码,但这种方式处理不一样,还有编译成其他形式的如JAVA是编译成"字节码文件"),再通过它的连接程序就调用了系统内部的一些库,实际点说是操作系统的动态连接库,也就是你操作系统和硬件(BIOS)打交道而且已经写好的函数库(这个解释不是很准确,我现在学习其他语言的时候,对...

weixin_31143391的博客 3158

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

编译时应该干什么 - 写代码如坐禅

http://huobengle.iteye.com/blog/1431212 在编译时应该闭眼,舒展身体,立刻座位走走。 好处: 1. 不让自己的工作思绪打乱。 2. 修养自己的身心,保证身体健康。 编译时不要上网浏览网页, 不要逛论坛,不要趁机听几分钟视频。 编译时指的就是工作的空闲时间,等待电脑为你完成一些事的时间。 你的工作流程看起来应该像这样: ...

aa495323137的博客 242

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++ 在编译阶段可以干什么? -- 学习笔记

编译阶段 编译是预处理之后的阶段,输入是通过预处理之后的C++源码,输出是二进制可执行文件。 编译阶段看到的都是 C++语法实体,比如说typedef ,using ,template , struct/class 这些关键字定义的类型,而不是运行阶段的变量。 比如说,让编译器去递归计算斐波那契数列 template<int N> struct fib // 递归计算斐波那契数列 { static const int value = fib<N - 1>::value

dream0130__的博客 899

工作中写的编译脚本,留着以后想是干什么的。

#!/bin/sh useage() {     echo "Usage:  ckt.sh"     echo "Example:"     echo "      ./ckt.sh user           # build user package."     echo "      ./ckt.sh eng            # build debug package."

qtebook的专栏 825

c语言需要编译器的作用,c编译器-c语言的编译器是干什么用的 爱问知识人

本人不才,仅就个人意见谈谈:1。什么是编译器:简单的说,编译器是一种将高级语言经过其解释,翻译成可以运行的二进制代码(有可能是汇编代码,但这种方式处理不一样,还有编译成其他形式的如JAVA是编译成"字节码文件"),再通过它的连接程序就调用了系统内部的一些库,实际点说是操作系统的动态连接库,也就是你操作系统和硬件(BIOS)打交道而且已经写好的函数库(这个解释不是很准确,我现在学习其他语言的时候,对...

weixin_39610488的博客 266

python手机编译器可以干什么_Python编译器是什么解释器是什么?

学习5476538azure.microsoft.com/zh-cn/search/documentation/?q=%E5%A4%A9%E6%B0%B4%E4%BB%A3%E6%A3%80%E6%9C%BA%E6%9E%84%E5%93%AA%E5%AE%B6%E5%A5%BD%E3%80%90Q2452.8222%20%E9%A1%BA%E5%88%A9%E8%BF%87%E5%85%B3%E...

weixin_33435783的博客 1万+

python手机编译器可以干什么_Python是什么?Python学习用哪些编译器?

Python是什么?Python是一个非常好用的程序语言,开发的速度非常快。Python的设计哲学是优雅、明确、简单。因此,Perl语言中总是有多种方法来做同一件事的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是用一种方法,最好是只有一种方法来做一件事。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。...

weixin_39832448的博客 173

昇腾CANN图编译黑盒打开之后:GE图引擎到底在干什么

GE是昇腾CANN里负责图编译的核心组件。它做的事情包括图解析、子图拆分、算子融合、内存复用优化、执行计划生成。把GE的编译流程搞清楚,就能理解为什么第一次跑慢、后面快,以及怎么避免动态shape带来的在线编译开销。如果你正在做昇腾上的模型部署,建议先把GE的图可视化工具用起来,看看你的模型被编译成了什么样子。很多时候性能问题(比如某个算子没被融合)在图可视化里一眼就能看出来。

2503_94138102的博客 402

为什么可以用c语言实现C编译器,c编译器-c语言的编译器是干什么用的 爱问知识人...

本人不才,仅就个人意见谈谈:1。什么是编译器:简单的说,编译器是一种将高级语言经过其解释,翻译成可以运行的二进制代码(有可能是汇编代码,但这种方式处理不一样,还有编译成其他形式的如JAVA是编译成"字节码文件"),再通过它的连接程序就调用了系统内部的一些库,实际点说是操作系统的动态连接库,也就是你操作系统和硬件(BIOS)打交道而且已经写好的函数库(这个解释不是很准确,我现在学习其他语言的时候,对...

weixin_26933735的博客 175

python手机编译器可以干什么_世界上最好的Python编辑器是什么?

在这种情况下,你需要使用一个 IDE(集成开发环境)或专用的代码编辑器。由于 Python 是最流行的编程语言之一,IDE 的选择也非常多。那么问题来了:「究竟什么样的 IDE 最适合 Python?」很明显,没有哪一个 IDE 或代码编辑器可以称得上是「最好」的 Python IDE 或编辑器。这是因为它们各有优劣。此外,从为数众多的 IDE 中进行挑选实在太浪费时间。但不用担心,本文已经为你整...

weixin_39633090的博客 238

c make干什么用得_Opencv 编译好的和用Cmake生成的有什么不同呢? Cmake是什么用的? 通俗些最好了,谢谢!...

你机子的某个盘里建一个新的文件夹,如我这里的完整路径是:d:\cmake\cmake-study\hellocmake; 然后在hellocmake文件夹里建立一个hellocmake.cpp文件,里面的代码如下:#include int main(){std::cout好,这些比较琐碎的东西介绍完,我们一起来看看cmakelists.txt里面的代码表示什么意思,争取每句代码都作解释,如果有不对...

weixin_34710938的博客 441

C 语言头文件守卫详解:#ifndef/#define/#endif 到底在干什么?-----宏定义在预编译的功能。

初学 C 语言时,我们都会在头文件里写这样一段代码:c#endif刚开始学的时候,我并不理解这几行到底在干什么,后来学习了一下,把“头文件守卫”的工作理解了一下。情况展开后声明次数编译结果有守卫add声明只出现 1 次✅ 编译通过无守卫 + 嵌套包含add声明出现 2 次❌ 报错。

2301_77676718的博客 256
上一篇: Linux内存闲谈
下一篇: Linux网络基础与性能优化
coding丁
博客等级 码龄9年 383粉丝 147原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值