C程序的编译过程及生成文件详解

想必大家在使用c语言编程时,编译后文件夹中会生成各类不同的文件,这些文件的作用是什么呢,整个编译的过程又是怎样实现的呢?下面我将逐一介绍。

一、C程序的编译过程

1、预处理

预处理器会根据预处理指令,如 #include 和 #define,将C源代码转化为一份更长的中间代码文件。预处理器还会执行条件编译指令,如 #ifdef 和 #endif,根据不同情况选择不同的代码分支。

2、编译

编译器会将预处理产生的中间代码翻译成汇编语言代码。在这个过程中,编译器会进行词法分析、语法分析、语义分析和优化等操作,生成可执行文件的目标代码。

3、汇编

汇编器会将编译器生成的目标代码翻译成机器语言指令,并生成可重定位目标文件。汇编器还会为目标文件添加符号表,以便链接器在连接多个目标文件时能够正确解析符号引用。

4、链接

链接器会将多个目标文件合并为一个可执行文件。它会解析符号引用,并将函数和变量引用解析成对应的地址。链接器还会进行地址重定向、符号弱化和库搜索等操作,最终生成可执行文件。

以上就是C程序的编译过程。在实际开发中,通常采用集成开发环境(IDE)或命令行工具来完成编译过程,并生成可执行文件。

二、编译后生成的文件

1、源代码文件(.c)

源代码文件是程序员编写的C源程序文件,包含了程序的逻辑和功能实现。在源代码文件中,我们可以定义函数、变量、结构体等。每个源代码文件通常对应一个模块或一个特定功能的实现。多个源代码文件组合在一起形成一个大型的C程序。

2、头文件(.h)

头文件用于声明函数、变量和结构体的原型以及宏定义等信息,供其他源代码文件使用。头文件中通常包含函数的声明、类型的定义、宏的定义等内容。头文件的目的是为了方便模块之间的交互和引用,避免重复编写相同的声明和定义。常见的头文件如 stdio.h、stdlib.h 等。

3、目标文件(.o、.obj)

目标文件是编译器将源代码文件编译生成的中间文件,包含了汇编语言代码或机器语言代码。目标文件是二进制文件,不可直接执行。目标文件是对源代码文件进行编译、汇编和优化后的结果。每个源代码文件会生成一个对应的目标文件,其格式可以是 .o(UNIX/Linux)或 .obj(Windows)。

4、可执行文件(.exe、无扩展名)

可执行文件是经过链接器将多个目标文件合并后生成的完整可执行程序。它包含了程序的二进制机器码,可以直接在操作系统上运行。在 UNIX/Linux 系统下,可执行文件通常没有扩展名;而在 Windows 系统下,可执行文件通常以 .exe 作为文件扩展名。

5、静态库文件(.lib、.a)

静态库是一组编译好的目标文件的集合,可以被程序在编译时链接到可执行文件中。静态库文件通常以 .lib(Windows)或 .a(UNIX/Linux)作为文件扩展名。使用静态库的优点是在程序运行时不需要加载额外的库文件,但会增加可执行文件的大小。

6、动态库文件(.dll、.so)

动态库是一组编译好的目标文件的集合,可以在程序运行时被加载到内存中供程序调用。动态库可以被多个程序共享,并且可以在不重启程序的情况下进行更新和升级。动态库文件通常以 .dll(Windows)或 .so(UNIX/Linux)作为文件扩展名。

除了上述文件类型,还有一些临时文件和辅助文件被生成,例如预处理文件(.i)、汇编代码文件(.s)、优化代码文件(.opt)等,这些文件在编译过程中起到中间结果的作用,并最终被清理或删除。

总结:在C程序的编译过程中,源代码文件被编译生成目标文件,然后多个目标文件被链接生成可执行文件。同时,还可以使用静态库和动态库文件提供的函数和变量。这些文件类型在不同的操作系统和编译器下可能有所不同,但核心概念和作用是相似的。

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

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

相关文章

ChatGPT AIGC 非常实用的AI工具集合大全

实战AI 工具箱 AIGC ChatGPT 职场案例60集, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu

GD32工程创建

1.创建空工程 在任意路径下创建空的test文件夹。打开keil5空工程创建空工程 选择对应的芯片型号: 然后把空工程保存到test文件夹下。会自动生成如下文件。 2. 添加组 下载GD32F10X的固件库:在百度里搜索GD32进入官网。 下载下来对应的文件如下&#xff…

PHP 实现 SHA256 with RSA 签名 (实例讲解)

背景 近期在对接 美餐支付 接口文档时, 重点需根据 sha256WithRSA 签名规则,进行加密处理 通过参考网上的签名经验,最后整理出适合自己业务使用的处理方法 欢迎各位指摘 … 实现方式 签名加密、解密代码: /*** Notes:生成 sha2…

MYSQL常用命令

一.数据类型 MySQL中有多种数据类型,每种类型用于存储不同类型的数据。以下是MySQL中常见的数据类型: 数值类型: INT:整数类型,存储范围为-2,147,483,648到2,147,483,647。BIGINT:大整数类型,存…

【蓝桥杯选拔赛真题63】Scratch云朵降雨 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch云朵降雨 一、题目要求 编程实现 二、案例分析 1、角色分析

AHH HackerHouse @Move大理站完美谢幕

Antalpha HackerHouse Move 大理站于2023年9月23日在面包树举办了Final DemoDay,这也代表着为期21天的 HackerHouse 活动完美谢幕。 自从9月3日开始,整整21天的共居时间里,我们从个体逐渐融汇成小团队,最终成为了一个紧密团结的大…

算法通关村-----寻找祖先问题

最近公共祖先 问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…

UI自动化测试 | Jenkins配置优化

前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家。 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试&…

软件测试之单元测试自动化入门基础

单元测试自动化 所谓的单元测试(Unit Test)是根据特定的输入数据,针对程序代码中的最小实体单元的输入输出的正确性进行验证测试的过程。所谓的最小实体单元就是组织项目代码的最基本代码结构:函数,类,模块等。在Python中比较知名…

OpenHarmony自定义组件介绍

一、创建自定义组件 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑…

安装ipfs-swarm-key-gen

安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…

Redis代码实践总结(二)

使用 CLI 探索 Redis 外部程序使用 TCP 套接字和 Redis 特定协议与 Redis 进行通信。该协议在不同编程语言的 Redis 客户端库中实现。然而,为了使使用 Redis 进行黑客攻击变得更简单,Redis 提供了一个命令行实用程序,可用于向 Redis 发送命令…

odoo16 取消“系统各功能状态日报”的邮件

odoo16默认情况下每周都会发送一个“系统各功能状态日报”的邮件,而且是所有人都发, 这个功能在哪配置呢? 今天研究了一下, 线索是“系统各功能状态日报”,先全文检索吧 #. module: digest #: model:digest.digest,na…

KUKA机器人通过3点法设置工作台基坐标系的具体方法

KUKA机器人通过3点法设置工作台基坐标系的具体方法 具体方法和步骤可参考以下内容: 进入主菜单界面,依次选择“投入运行”—“测量”—基坐标,选择“3点法”, 在系统弹出的基坐标编辑界面,给基座标编号为3,命名为table1,然后单击“继续”按钮,进行下一步操作, 在弹出的…

批量删除wordpress文章修订版本/自动草稿残留数据(3种方法)及四种方法禁用WordPress文章历史修订/自动保存/自动草稿功能

目录 1、批量删除wordpress文章修订版本/自动草稿残留数据(3种方法) 方法一:SQL命令批量删除 命令: 方法二:利用PHP代码来删除 方法三:利用数据库清理优化插件 WP Clean Up 或 WP Cleaner 批量删除 2…

【STM32基础 CubeMX】从0带你点灯

文章目录 前言一、GPIO的概念二、CubeMX配置GPIO2.1 基础配置2.2 GPIO配置 三、点灯代码讲解3.1 cubemx生成的代码3.2 1个库函数 四、LED闪烁总结 前言 一、GPIO的概念 STM32是一系列微控制器芯片的品牌,它们用于控制各种电子设备。其中的GPIO是通用输入/输出端口的…

在优化问题里,强化学习相比启发式算法有什么好处?

本文出自https://mp.weixin.qq.com/s/J1SsNtU1wkqdGcKZvNACHw纯属个人科研收餐使用 存在部分数学符号和公式,都可通过上面链接查看!!!! 关于强化学习和传统优化算法(包括:数学优化,启发式,元启发式)的探讨越来越多了,很多同学可能是一上来就集中在一个方向和方法上,…

触觉智能 PurPle Pi OH(OpenHarmony)开发板

资料汇总 内容预览 产品介绍 PurPle-Pi OH 规格书​​​​​​ 系统编译 Purple-Pi-OH Linux SDK编译 Purple-Pi-OH OHOS SDK编译 使用手册 Purple-Pi-OH Ubuntu系统使用手册 常见FAQ 常见问题 官网 官网地址 Purple Pi OH介绍 Purple Pi OH作为一款兼容树莓派的开…

Hive【Hive(三)查询语句】

前言 今天是中秋节,早上七点就醒了,干啥呢,大一开学后空教室紧缺,还不趁着假期来学校等啥呢。顺便偷偷许个愿吧,希望在明年的这个时候,秋招不知道赶不赶得上,我希望拿几个国奖,蓝桥杯…

Spring结合自定义注解实现 AOP 切面功能

Spring结合自定义注解实现 AOP 切面功能 Spring AOP 注解概述Aspect 快速入门execution 切点表达式 拦截指定类的方法Pointcut("annotation(xx)") 拦截拥有指定注解的方法环绕通知 实现开关目标方法案例1:自定义注解切面实现统一日志处理1.自定义日志注解…