在Linux系统下C语言编译过程的四个步骤_linux下编写一个c程序的基本过程分为几部分?-程序员宅基地

技术标签: C语言  

1. 简介

C语言程序从源代码到可执行文件(二进制文件)都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程。
以hello.c文件为例:

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

在linux下编译C程序:

$ gcc hello.c -o hello # 编译
$ ./hello # 执行
hello world! # 输出文本

2. 编译的步骤

gcc命令编译C语言的过程中依次执行了四步操作:

  1. 预处理(Preprocessing)
  2. 编译(Compilation)
  3. 汇编(Assemble)
  4. 链接(Linking)
    在这里插入图片描述
2.1 预处理(生成.i文件)

预处理器对源代码其进行一些文本性质的操作, 主要任务包括:

  1. 删除注释
  2. 插入被 #include 指令包含的文件内容
  3. 替换由 #define 定义的符号
  4. 确定代码的部分内容是否应该根据一些条件编译指令进行编译

预处理会生成一个.i的文件。

命令:

gcc -E hello.c -o hello.i
2.2 编译(生成.s文件)

编译器gcc把预处理后的文件进行语法分析、语义分析以及优化后生成汇编代码文件

命令:

gcc -S hello.i -o hello.s
2.3 汇编(生成.o文件)

汇编器把汇编代码文件转换成中间目标文件
命令:

gcc -c hello.s -o hello.o  // 注意:此处-c为小写
2.4 链接(生成可执行文件)

链接器把目标文件与所需要的附加的目标文件(如静态链接库、动态链接库)链接起来成为可执行的文件
命令:

gcc hello.o -o hello
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Cuienjie/article/details/106763192

智能推荐

Unity Texture2D的可读性问题_argumentexception: texture2d.getpixels: texture da-程序员宅基地

文章浏览阅读4.1k次。今天测试使用UMP播放网络摄像头的数据。处理截图的时候发现,显示摄像头图像的RawImage里面的图片保存不出来。研究了很久才发现这个时候里面的texture数据应该是不可读,所以直接使用EncodeToJPG()函数没有用。需要把这个Texture2D的数据转成可读的,方法如下// 复制出可读的Texture2D private Texture2D CopyT2DToWrite(Texture2D source) { // 先把Texture2D转成临时的_argumentexception: texture2d.getpixels: texture data is either not readable,

Error:kCFStreamErrorCodeKey=-2102 Domain=kCFErrorDomainCFNetwork Code=-1001 - iOS-程序员宅基地

文章浏览阅读7k次。之前早已调通的接口,因有新业务叠加新增了一些数据字段,之后再次调试接口的时候请求等待延迟至设定超时时间后出现了如下异常:[discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" U..._kcferrordomaincfnetwork code=-1001

汇编语言 十六进制转换为二进制_十六进制转二进制小程序-程序员宅基地

文章浏览阅读2.5w次,点赞26次,收藏148次。汇编语言程序,十六进制转换为二进制_十六进制转二进制小程序

51nod-1279 扔盘子_51nod - 1279-程序员宅基地

文章浏览阅读364次。1279 扔盘子题目来源: Codility基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。盘子有几种命运:1、掉到井底。2、被卡住_51nod - 1279

消融实验的目的_深度学习中为什么采用消融实验-程序员宅基地

文章浏览阅读307次。消融实验就是通过出去模型的某一模块或者是功能,然后与原来的模型进行比较运行结果,即削弱系统的某个组件后使其继续正常运行_深度学习中为什么采用消融实验

【linux】nvidia-smi 查看GPU使用率100%_centos gpu没跑程序使用率100%-程序员宅基地

文章浏览阅读5.5k次,点赞4次,收藏18次。linux服务器下使用nvidia-smi or nvidia-smi -l 1【数字表示输出间隔】命令查看GPU使用情况,三种情况1、没有进程,GPU使用率为空这种情况表示,没有进程占用GPU资源,属于为空的正常状态2、有进程,GPU使用率在变化我们如果想要终止进程ps -ef|grep pythonkill -9 58828 # 58828是该进程id当然,也可以杀死所有python进程killall -9 python以前写的博客有以上教程,戳我进入。3、看_centos gpu没跑程序使用率100%

随便推点

在本地浏览器上查看远程服务器上的tensorboard_访问tensorboard的url post-程序员宅基地

文章浏览阅读673次,点赞2次,收藏4次。1. keras中生成tensorboard日志信息 由于tensorboard日志是记录并且可视化训练过程的各个指标和权重信息的,所以需要通过回调函数来实现训练过程中的记录,然后将相应的回调函数传给模型的fit方法即可。如下所示,tf.keras.callbacks中有现成的回调函数,然后将其传给fit方法的callback参数即可。训练完成后就会在logdir目录下生成相应的信息文件。log_dir = "logs/fit/" + datetime.datetime.n..._访问tensorboard的url post

解决git冲突步骤(超详细)_git解决冲突-程序员宅基地

文章浏览阅读2.7w次,点赞10次,收藏112次。本文介绍git冲突产生原因,详细介绍两种冲突的解决步骤(图文详细说明),包括merge冲突、push/pull冲突两种冲突类型的详细解决步骤_git解决冲突

java项目日常运维需要的文档资料_项目运维文档-程序员宅基地

文章浏览阅读791次,点赞11次,收藏12次。java项目开发完成,部署上线,进入项目运维阶段,日常工作需要准备哪些资料和文档?当项目上线后,运行一段时间,或多或少会遇到一些运维上的问题,比如服务器磁盘饱满,服务器CPU,内存使用率过高,应用存在安全漏洞,应用报错,临时需求编个变更等等。诸多问题。那么若想快速响应,平时就需要准备好与项目运维相关的文档和资料。我总结了以下一些内容。_项目运维文档

【树(Tree)详细介绍】_树的应用场景-程序员宅基地

文章浏览阅读175次。树是一种重要的非线性数据结构,它具有层级关系,由一组以边连接的节点组成。树有许多不同的分类和应用场景,每种树的类型都有其特定的特点和用途。了解树的基本概念和常见的树的分类,有助于我们在实际问题中选择合适的数据结构和算法,提高程序的效率和性能。_树的应用场景

java基础入门学习菜鸟入门第七天——java中的方法、变量_参数列表哪四种情况-程序员宅基地

文章浏览阅读266次。JAVA基础知识——方法、变量3.2方法3.2.1什么是方法?方法的定义:解决一类问题中代码的有序组合方法,是一个功能模板,也就是将很多行代码放置在一组 {} 中,形成一个代码块。3.2.2为什么需要使用方法?提高代码的复用性提高后期代码的扩展性、延展性提高代码后期的维护性案例://计算一个圆柱的表面积import java.util.Scanner;publi..._参数列表哪四种情况

SAP_ABAP_在SE11表中检查初始值initial value,ABAP中的初始值和空值_sap initial values-程序员宅基地

文章浏览阅读6.7k次。1、在开发中遇到这样的情况:一个表使用了一段时间之后需要增加一些字段,而表中已经存在数据了。2、SE16(N)查看数据时,SAP把具有初始值和空值的字段都显示为初始值,但是在查询语句中,它们在数据库中的行为是不一样的。_sap initial values

推荐文章

热门文章

相关标签