多个.C文件被编译为一个可执行文件的详细过程

news2024/12/30 1:47:36

多个.C文件被编译为一个可执行文件的详细过程

文章目录

  • 多个.C文件被编译为一个可执行文件的详细过程
  • 前言
  • 一、一个.C文件的编译过程
  • 二、多个.C文件的链接过程
    • 1.文件信息
    • 2.链接过程
    • 3.makefile
  • 总结


前言

C语言经典的 “hello world ” 程序从编写、编译到运行,看到屏幕上输出,如此简单的一行代码一个文件,估计那么你都知道它是如何运行的。在C的世界里,一个函数,一个变量都只是一砖一瓦,一个由多个C语言文件文件组成的项目又是如何从砖瓦筑到高台的?

一、一个.C文件的编译过程

一个.c文件编译过程如下所示:
在这里插入图片描述
1.预编译:宏定义、头文件展开、处理条件编译真假值、去注释,得到一个纯净的C(.i)文件, 命令:gcc -E xxx.c -o xxx.i 得到纯净.i文件
2.编译:分析语法语义,优化后生成相应的汇编代码文件,也是编译种最复杂最核心的步骤, 命令:gcc -S xxx.c -oxxx.s 得到汇编.s文件
3.汇编:汇编器根据汇编指令和机器指令的对照表,将汇编文件翻译为机器可以执行的指令, 命令:gcc -c xxx.s -o xxx.o 得到二进制.o文件
4.链接:依照规定格式将多个相互依赖(函数变量访问)的C语言模块拼接为一个完整可执行文件,命令:gccxxx.o -o xxx.out生成.out文件

二、多个.C文件的链接过程

我们进阶说一下当多个相互依赖的C文件进行编译时,链接的作用,首先有这样一个main.c文件。

#include<stdio.h>

int add(int a,int b);

int main(int argv,int argc[])
{
  int a,b = 1,c = 2;

  a = add(b,c);  
  printf("hello world \n");
  printf("a = %d\n",a);
 
  return 0;
}

关于调用的函数int add(int a,int b);我们定义到fun.c中

#include<stdio.h>

int add(int a,int b)
{
  return a+b;
}

现在出现两个C源文件,在实际开发中也是按照功能不同,需要将代码模块存放到不同文件中,需要注意的是编译过程却都是以单个源文件进行的,那么我们怎么编译得到想要的可执行文件呢?可以看下张图:
在这里插入图片描述
以上就是整个多文件编译过程

1.文件信息

分开编译形成形成两个main.o和fun.o两个可执行文件,此时已经分别完成了二进制代码的封装,我们可以看下其文件信息

使用命令:readelf -h mian.o,可以看到文件类型、属性和支持的操作系统等

在这里插入图片描述

使用命令:readelf -S mian.o,可以看到文件中使用的代码区域、区块、堆栈等

在这里插入图片描述

使用命令:objdump -s -d mian.o,可以看到 < m a i n > <main> <main>中左边是机器代码,右边是对应的汇编代码,可以看到右边两个callq分别代表printf和add函数的地址,但是此时因为还没有进行链接,所以左边对应的地址都 00 00 00 00 .

在这里插入图片描述

使用命令:objdump -r mian.o,可以找到代码块地址重定位表看到右侧出现了add和printf,以及puts其分别位于偏移量28、35和49的位置,地址类型和长度都为R_X86_64_PC32.

在这里插入图片描述

2.链接过程

我们将fun.c文件也编译为.o文件,通过命令gcc main.o fun.o -o main.out将两个.o文件编译为可执行文件,随后就可以直接运行:./main.out
链接就是将编译后的所有目标文件、静态库、动态库组合为一个可执行文件。

3.makefile

实际工程中有许多文件,我们不可能一个一个来进行编译,这就不得不说一个强大的编译工具了:Makefile,
将就上述例子,我们编写一个如下makefile:

all: main

main:	main.o func.o
	gcc main.o func.o -o main

main.o:	main.c
	gcc -c main.c

func.o: func.c
	gcc -c func.c

clean:
	rm -f main main.o func.o

从上至下来看,
all:main 表示所需要的目标可执行文件,
main: main.o func.o 表示需要得到目标文件main,我们需要main.o 和func.o文件,并执行命令gcc main.o func.o -o main
main.o: main.c 表示需要main.o文件,我们需要main.c文件,并执行命令 gcc -c main.c
fun.o: fun.c 表示需要fun.o文件,我们需要fun.c文件,并执行命令 gcc -c fun.c
clean:rm -f main main.o func.o表示输入clean指令,将删除main、main.o和 func.o文件

总结:makefile就是在定义一个依赖树,构建目标文件,我们需要一层一层递归寻找所有叶子文件,如果有一个文件被修改,也只会影响这一个文件的目标文件(.o文件)和其相关的被依赖文件,其他没修改过的文件不会去重新编译,非常高效,

注意:当拷贝了一个新的项目进行第一次编译时,最好先执行clean命令再重新构建,防止环境变量不匹配导致出现问题(教训)

总结

1.C语言有着严格的编码和编译过程,链接过程在编译中的位置非常重要,这种方式也演变出另外一种模式:动态库
2.makefile非常重要!非常重要! 非常重要!

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

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

相关文章

electron-vite工具打包后通过内置配置文件动态修改接口地址实现方法

系列文章目录 electronvitevue3 快速入门教程 文章目录 系列文章目录前言一、实现过程二、代码演示1.resources/env.json2.App.vue3.main/index.js4.request.js5.安装后修改 前言 使用electron-vite 工具开发项目打包完后每次要改接口地址都要重新打包&#xff0c;对于多环境…

揭秘Ping32如何实现上网行为监控

企业上网行为管理软件在现代企业管理中扮演着举足轻重的角色。它不仅能够监控和记录员工的上网行为&#xff0c;还能有效防止数据泄露和不当使用&#xff0c;从而保障企业的信息安全。 一、Ping32上网监控软件的具体功能包括&#xff1a; 1.网页浏览监控&#xff1a;对Chrome…

[C++核心编程-06]----C++类和对象之对象模型和this指针

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

文心一言 VS 讯飞星火 VS chatgpt (255)-- 算法导论18.3 1题

一、请说明依次从图18-8(f)中删除C、P和V后的结果。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;让我们明确一点&#xff1a;由于您没有提供具体的图18-8(f)的内容&#xff0c;我只能假设它是一个数据结构&#xff08;可能是图、树或列表等&…

【spring】Security 密码加密算法

Spring Security 提供了多种密码加密算法&#xff0c;用于在存储用户密码时进行加密&#xff0c;以增强安全性。 查看org.springframework.security.crypto.factory.PasswordEncoderFactories 以下是一些常用的密码加密算法&#xff1a; BCryptPasswordEncoder&#xff1a; 这…

白酒:酒精度数与白酒品质消费的关联性研究

酒精度数作为白酒的一项重要指标&#xff0c;不仅影响着白酒的口感和风格&#xff0c;更在很大程度上与白酒的消费存在密切关联。在探讨云仓酒庄豪迈白酒时&#xff0c;我们不能忽视酒精度数与品质消费之间的关联性。 首先&#xff0c;酒精度数的高低直接影响到白酒中酒精的含量…

企业活动想联系媒体报道宣传如何联系媒体?

在企业的宣传推广工作中,我曾经历过一段费事费力、效率极低的时期。那时,每当公司有重要活动或新项目需要媒体报道时,我便要一家家地联系媒体,发送邮件、打电话,甚至亲自登门拜访,只为求得一篇报道。然而,这样的过程充满了不确定性和挑战,时常让我感到焦虑和压力山大。 记得有一…

gif压缩大小但不改变画质怎么做?分享5个压缩GIF原理~

GIF&#xff08;图形互换格式&#xff09;是网络上广泛使用的一种图像格式&#xff0c;因其支持动画而备受欢迎。然而&#xff0c;随着动画越来越复杂和高分辨率&#xff0c;GIF 文件大小也随之增加&#xff0c;可能导致加载速度变慢和带宽消耗增加。在这篇文章中&#xff0c;我…

编程怎么学?踏上编程之旅:如何高效学习编程

编程怎么学&#xff1f;踏上编程之旅&#xff1a;如何高效学习编程 编程&#xff0c;作为数字时代的核心技能&#xff0c;正吸引着越来越多的人投身其中。然而&#xff0c;面对浩瀚的知识体系和纷繁的学习资源&#xff0c;初学者往往感到迷茫。本文将为你指引一条高效的编程学习…

pyqt动画效果放大与缩小

pyqt动画效果放大与缩小 QPropertyAnimation介绍放大与缩小效果代码 QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c;例…

[每周一更]-(第96期):Rsync 用法教程:高效同步文件与目录

文章目录 一、引言二、rsync 基本概念三、介绍rsync 是什么&#xff1f;四、安装五、rsync 基本语法常见示例&#xff08;默认ssh协议&#xff09;&#xff1a; 六、常用选项1. -a 或 --archive2. -v 或 --verbose3. -z 或 --compress4. --delete5. --exclude6. --exclude-from…

飞腾E2000运行Zephyr操作系统

Phytium-Zephyr-SDK 1. 仓库介绍 1.1 本仓库特色 此项目是一个开源软件&#xff0c;专为物联网领域设计&#xff0c;基于Zephyr实时操作系统&#xff0c;针对Phytium系列CPU进行了专门的适配和应用开发。我们的目标是降低开发者的使用门槛&#xff0c;提供了部署文档和使用指…

【算法入门赛】B. 自助店评分(C++、STL、推荐学习)题解与代码

比赛地址&#xff1a;https://www.starrycoding.com/contest/8 题目描述 在上一场的入门教育赛中&#xff0c;牢 e e e找到了所有自助店的位置&#xff0c;但是他想发现一些“高分好店”&#xff0c;于是他利用爬虫技术从“小众点评APP”中爬取了武汉所有自助店的评分。 评分…

Linux应用(四)——系统IO函数

本节学习linux系统中常见的IO函数&#xff0c;讲解及其基本用法&#xff1b; 一、 open/close函数 open函数作用:系统调用open函数&#xff0c;打开指定路径的文件&#xff1b; int open(const char *pathname, int flags&#xff09;&#xff1b;打开一个存在的文件&#xff1…

【大学物理】东北大学-马文蔚听课笔记

4.1刚体的定轴转动_哔哩哔哩_bilibili 此笔记为课堂学习笔记~ 4.1刚体的定轴转动 基本教学要求 什么时刚体呢&#xff1f; 研究刚体运动切口 平动&#xff1a;刚体中所有的点的运动轨迹都完全相同。 转动&#xff1a;分为&#xffe5;定轴转动和非定轴转动 刚体转动的角速度…

人脸采集训练识别

项目概述&#xff1a; 本地摄像头采集人脸数据集&#xff0c;通过训练得到trainingData.yml模型&#xff0c;加载haarcascade_frontalface_default.xml实现人脸识别。haarcascade_frontalface_default.xml 文件并不是一个完整的人脸识别模型&#xff0c;而是一个用于检测正脸&a…

基于Spring Cloud的房产销售平台设计与实现

基于Spring Cloud的房产销售平台设计与实现 开发语言&#xff1a;Java 框架&#xff1a;SpringCloud JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页界面&#xff0c;前台首页包括房源信息、…

RS485空调系统到BACnet江森楼宇系统的高效整合攻略

智慧城市的每一栋建筑都在追求更高的能效与更佳的居住体验&#xff0c;而这一切的实现离不开强大且灵活的楼宇自动化系统。其中&#xff0c;协议转换网关作为连接不同设备的纽带&#xff0c;扮演着至关重要的角色。本文将以一个典型的商业综合体为例&#xff0c;揭秘BACnet协议…

零基础开发新闻小程序带评论点赞收藏功能,可以回复评论,借助小程序云开发云模板开发一款图文小程序,新闻列表新闻详情,登录注册功能

小程序官方有改版了&#xff0c;搞得石头哥不得不紧急的再新出一版&#xff0c;教大家开通最新版的cms网页管理后台 一&#xff0c;技术选型和技术点 1&#xff0c;小程序前端 wxml css JavaScript MINA原生小程序框架 2&#xff0c;数据库 云开发 云数据库 云…

力扣:62. 不同路径

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…