详细介绍:基础开发工具--编译器g++/gcc 自动化构建make/Makefile

news/2026/1/24 13:55:12/文章来源:https://www.cnblogs.com/yangykaifa/p/19526153

目录

gcc/g++

为什么要先生成.o再一起生成可执行?

为什么从源代码变成可执行的脚本需要 预处理 编译 汇编 链接四步?

条件编译的用途

动静态库 动静态链接

1.先理解为什么要有库?

2.如何区分动静态库? ---经过后缀

3.为什么库是这样的名字呢?--------库的命名规则

动静态链接

动静态库

动静态库的对比

在linux中验证

技术上再理解库

不过假如我不想让被人看的我函数的实现呢?

make/Makefile

一.初步认识

有两点注意的

在上面提到了一直允许被执行 那么还有不被执行的吗? 为什么呢?

那么是make和makefile是怎么知道哪个新哪个旧的呢?

二.我们也可以用下面的类似于宏替换的方式来把之前的内容做一个替换

三.如果有多个文件呢


gcc/g++

gcc和g++都是编译器 区别在于gcc只支持c语言 g++既支持c也支持c++

从源代码变成可执行的程序 必须预处理 编译 汇编 链接四步

预处理------宏的替换/去注释/条件编译(#ifdef #ifndef #endef) /头文件展开等的操作 (这些过程其实就是把文本代码进行了一些改变)

编译------把预处理后的代码转换为汇编代码

汇编------将汇编语言翻译成二进制机器码

链接----将多个目标文件和库文件合并为 可执行程序

运用方式 gcc [ 选项 ] 要编译的文件 [ 选项 ] [ 目标文件]

下面是由一个.c文件经过这四步后生产可执行程序的过程

也可以由.c文件直接生成可执行的程序

如果有多个.c文件 我们一般会先把所有的.c资料全部编译生成.o文件 然后把所有的.o文件一起编译为一个可执行的程序

为什么要先生成.o再一起生成可执行?

1.不是所有的源代码结果都是要形成可执行的程序 如头文件-其实就是.o文件打了个包如果其他文件涵盖头文件 在链接的时候会结合生成可执行程序

2.之前我们写的代码最终是生成了一个可执行的脚本 不过如果有1000个源文件 要把他们分别形成多个可执行程序的话 此时只得先把他们分别都编译形成.o文件 随后再分别多个.o文件直接生成对应的可执行程序

并且之前在vs下写的代码文件里面也可以看到都有一个.obj的文件其实就是对应着linux中的.o文件 也是先会把源文件生成.o的文件


为什么从源代码变成可执行的程序需要预处理 编译 汇编 链接四步?

这和语言发展的顺序有关

1.计算机只能识别二进制的0和1 所以最初利用到的编程方式是打孔编程(给计算机传纸条 纸条上有孔 通过光敏的机器来控制 有光无光的方式来表示0和1)

2.后来发现这种方式太容易出错很麻烦也很难理解 后来有了汇编语言此时我们就需要编译器用来把汇编语言翻译为机器所能识别的二进制机器码 这个编译器是由二进制机器码写的之后程序员就可以用汇编语言来写代码了 然后通过编译器来把汇编语言翻译成机器码

编译器的自举: 上面提到该把汇编语言翻译成机器码的编译器是由机器码写的 是因为当时只有机器码而借助该编译器实现汇编语言后 此时这个编译器就可以由汇编语言来实现了 这个编译器由汇编语言实现 作用是把汇编语言转换为机器码

逻辑是先有汇编语言这个想法 然后通过现有的机器码建立编译器 汇编语言就真正实现了在汇编语言实现之后 此时这个编译器就可以通过汇编语言来实现了 其实最底层还是通过机器码达成的

之后后面又有了c语言 由同样的逻辑慢慢形成了c语言及c语言的编译器

在理解了这个逻辑之后 为什么后面不直接写一个把c语言转换为机器码的编译器呢?

这是因为直接从c到机器码很复杂 而在c语言出现之前汇编语言已经发展了很久了从汇编到机器码的翻译已经非常的成熟了所以有了c后我们只需要考虑把c转换为汇编语言就可以了

条件编译的用途

1.例如一些软件分为普通版和企业版 企业版是收费的 普通版和企业版不是不同的两版 普通版其实就是企业版进过裁剪后的版本 而这个裁剪的方式用到的就是条件编译

2.内核源代码也是根据不同的需求采取条件编译的方式对代码进行裁剪

3.使开发工具或者应用软件可以在不同版本都可以使用 例如有的软件可以在linux使用 有的可以在window使用 有的在这两种系统下都允许使用

动静态库 动静态链接

1.先理解为什么要有库?

假设没有库 那么对于每一个程序员来说想使用类似printf 这样的函数就要求大家自己实现 这样就很的麻烦 而且每个人设计的都不统一 就像生活中的衣食住行我们想要什么都需要我们自己去手动完成就会非常的麻烦 且一些应该统一的地方每个人设计的不同可能会使社会混乱

所以库的存在是非常有必要 库是一种方法素材集 为我们开发提供了最基本的保证(基本接口.特性) 加速了我们二次开发

库分为动态库和静态库

2.如何区分动静态库? ---通过后缀

动态库 : 在linux下的后缀为.so 在windows下为.dll

静态库: 在linux下为.a 在windows下为.lib

例如linux下c的动态库为libc.so c的静态库为ibc.a

3.为什么库是这样的名字呢?--------库的命名规则

linux下lib+库名称.so(a)也就是实际上库的名称要把前面的lib及后缀去掉

动静态链接

静态链接

编译阶段就会直接把静态库中所依赖的内容直接复制一份到脚本里面在之后使用的时候就直接使用拷贝过来的内容 如果是多个程序需拷贝多份

动态链接

运行时通过动态链接器加载依赖的共享库 程序仅记录库的引用实际代码在运行时加载在使用的时候会跳转到对应的库中执行相应的函数 在执行之后会跳转回来

动静态库

库本质就是.o文档打包后形成

静态库在编译时被直接合并到可执行文件中。程序运行时,无需依赖外部库文件。

动态库在程序运行时由动态链接器加载。程序仅记录对库函数的引用,实际代码在运行时解析。

动静态库的对比

1.静态库在编译时进行链接 成为可执行文件的一部分 动态库在运行时进行链接

2.缘于静态库需要成为可执行文件的一部分静态库的程序体积更大

3.可执行程序对静态库的依赖度小高度依赖动态库如果库缺失或者版本不兼容程序无法正常运行

4.程序运行需要加载到内存 静态链接的会在内存中出现大量的重复代码

5.动态链接比较节省内存和磁盘资源

在linux中验证

ldd 查看可执行程序依赖哪些动态库

用c语言写的就是用ldd查看linux下的指令依赖的库发现也有c库 也证明了linux下的指令其实就

在linux中链接时候默认动态链接

如果想控制静态链接需要在后面加-static不过需要安装有对应的静态库 而默认并没有安装c的静态库 需要我们自己安装 系统默认有动态的没有静态的也意味着环境推荐我们采用动态的方式

安装c的静态库后 使用-static的方式静态链接后 使用file可以观察到所依赖的就是静态链接

如下可以发现 用静态编译的方式文件大小明显大于动态编译的文件大小

在测试c++文档同样如此 静态链接的方式程序大小明显大于静态链接程序大小

技术上再理解库

可是如果我不想让被人看的我函数的搭建呢?

如下 通过只有编译后的.o记录和头文件 却能够正常的编译出可执行程序而只有.h和.o资料 别人在.h文件只能看到函数的声明 .o文件已经是二进制机器码了 别人看不出内容此时别人就无法看到我们函数实现的逻辑了

所以我们只要提前把.c文档编译为.o文件 然后把.o文件和头文件传过去就可以让别人看不到我们函数的实现了

1.所以动静态库的本质就允许理解为很多.o文件打包形成的

2.如下 可以看到有很多的.h文档和很多的库(.o材料打包形成的) 因而我们之前写的一个main.c文件 其实就是先编译为.o文件 然后和已有的打包成库的.o进行链接 就形成了可执行的程序 所以链接的本质就是把.o文件合并

make/Makefile

一.初步认识

Makefile是Unix/Linux 系统下用于自动化构建项目的工具,借助定义规则和依赖关系,实现代码的编译、链接和清理等操作。它通常与make命令配合利用,能够显著提高开发效率,尤其是在大型项目中。简单来说make是一个指令 Makefiel是一个文件

如下在Makefile文档中写了如下的代码后 依赖关系开始应该 是用TAB键开始(自动空出四个字符)

在命令行中直接输入make就会直接生成code程序了 相当于执行了上图第二行的依赖关系由mycode.c文件通过gcc生成了code可执行程序

类似于上面 在里面写一个clean 使用时候就会把code给删除了

有两点注意的

1.直接make 会在Makefile档案中从上往下扫描默认形成第一个目标文件

例如对于上面来说第一个目标文件是code 直接make就会生成code 而采用make clean才会进行删除

clean 运用生成code的就需要make code了就是如下 如果把他们调换了顺序 直接make默认的就

2. . PHONY

.PHONY是一个特殊目标,用于声明伪目标。它的作用是告诉make命令---某个目标不是真实的文件而是一个逻辑上的任务名称所以该伪目标就能够一直执行-对应的依赖关系和方法



在上面提到了一直可以被执行 那么还有不被执行的吗? 为什么呢?

确实有不被执行的默认老代码不会被重新执行

如下make生成code后 再次make就会提示告诉我们 此时这个code是最新的了已经 而旧的 所以就不会被重新执行就是code的所依赖文件mycode.c相对于code来说

那么是make和makefile是怎么知道哪个新哪个旧的呢?

在之前指令的学习中学习到过 stat会显示文件最近被更改的时间 而这个时间有三种

Access Modify Change

文件=内容+属性

①文件的内容改变了 Modify会改变

②文件的属性改变了 Change会改变

③查看了文件后 Access被更新

Modify被更新 Change也会同步被更新因为档案内容改变了 文件的大小size也会发生变换甚至Modify本身也算属性 Modify被更新了 Change也会被同步被更新

但 Change被更新 Modify不一定更新 例如权限修改之后 Change被更新了 而Modify不会被更新

查看文档后Access被更新 但能够发现继续多次进行cat stat这一行为后 Access并没有被进行更新

这是为什么呢?

因为大家查看一个文件绝大多数情况只是单纯地看 少部分会进行修改 而对于Access的更新维护也是需要成本的 所有只有查看一定的次数后 Access才会进行更新 并不是实时更新

回到正题上

make Makefile中判断目标释放被执行 就是利用检查Modify(文件的内容) 而每个文件都有Modify

可以利用下面时间轴来理解 如下mycode.c第一次被执行后生成code 此时code相对于mycode.c是新的 此时再次make就不能再次执行

更新的了 就许可再次make就是但是 在vim mycode.c 在把里面的内容修改之后 此时mycode.c相对于code

也许可经过touch更新Modify来再次让make可被执行就是在之前指令学过的touch除了可以创建普通文件外 还可以更新材料的时间 于

所以.PHONY:就是告诉编译器不要考虑修改时间的问题 直接编译就好了

而我们一般可编译的工具不会用PHONY修饰 若是这个程序很大的话 编译也是有消耗的 可执行的程序如果没有进行更新我们就不期望对其重新编译

二.我们也可以用下面的类似于宏替换的方式来把之前的内容做一个替换

为了验证可行性就是下面的test

例如

MIN=0 就类似于c宏替换的 define MIN 0

在使用的时候 $ (MIN) 才代表着 0

test测试用echo输出会把echo也打印出来 我们不期望它也显示的话 可以在前面加个@

如下就是用这种方式替换为的样子 实际上和之前是完全一样的

并且其实可以用$(@)来替换目标文件 $(^)来替换依赖档案 当所依赖文件很多时候就可以体现它的价值 如后面

使用make时候 会默认时候提示一些信息

我们行用@把之前的屏蔽掉 然后通过echo输出我们自己想要的提示信息

三.倘若有多个文件呢

假如有多个.c记录呢

之前提到 我们期望先把所有的.c编译为.o文件 然后再进行链接生成可执行的软件 所以这里我们也把Makefile修改成这样

下面.c文件生成.o文件可以让所有的.c文件生产对应的.o材料

此时还有两个地方需要修改

由多个.o一起生成一个可执行程序的就是1.由.o生成可执行程序可能

2.clean的时候 要一次删除所有的.o文件

通过下面的方式允许解决

此时我们依据make就行一次性把所有的.c文件先编译成.o文件 然后再一起生成一个可执行的程序

make clean就可以一下把所有的.o文件和终于生成的程序给删除

接下来测试一下

此时有如下 一共12个.c文件

make之后的结果

ll查看确实都生成了

make的结果 确实所有的.o文件及可执行程序都被删除了

所有有了这样的Makefile 之后大家就可以经过make一次性的把所有的.c文件编译成.o文件再生成一个可执行的软件 make clean就可以一次性的把所有的.o文件和可执行的程序删除掉 给我们带来了很大的便利

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

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

相关文章

学习机哪个品牌更专业?2026年学习机推荐与评价,针对互动性与质量痛点

研究概述 在数字化教育浪潮与家庭教育投入持续增长的背景下,学习机已从辅助工具演变为学生核心的学习平台。面对市场上品牌众多、功能各异、宣传纷繁的现状,家长与教育工作者在选购时常陷入信息过载与选择困难的困境…

基于DeepSeek-R1手搓AI Agent智能体(手把手,个人电脑也能玩哦)

本篇文章介绍使用Ollama本地部署DeepSeek-R1 8B通用大模型,作为Agent智能大脑,基于Python3.11(虚拟环境管理工具Conda)、Langchain开发框架、Chroma向量数据库、ReAct提示词模版等工具进行开发AI Agent人工智能体。为了便于理解智…

2026年学习机品牌推荐:智慧教育趋势排名,涵盖启蒙与备考全阶段核心需求

在数字化浪潮席卷教育领域的当下,智能学习机已从辅助工具演变为家庭教育的核心基础设施。面对市场上品牌林立、功能各异的产品,家长与教育工作者在决策时普遍面临核心焦虑:如何在保障孩子视力健康与学习专注度的前提…

2026年本地整装装修企业排行榜,廊坊富迪装饰名列前茅

在京津冀地区的家装市场中,选择一家靠谱的本地整装装修企业,直接关系到业主的居住体验与生活品质。面对行业内良莠不齐的服务乱象,如何找到真正有实力的本地整装装修品牌企业?以下结合不同服务定位,为你推荐2026年…

探寻荧光磁粉探伤机高品质厂家如何选择

问题1:什么是荧光磁粉探伤机?为什么说选择高品质厂家很重要? 荧光磁粉探伤机是利用铁磁性材料在磁场中被磁化后,缺陷处会产生漏磁场,吸附荧光磁粉形成可见荧光痕迹,从而检测工件表面及近表面裂纹、夹杂等缺陷的无…

2026年唐山沼气/煤气脱硫厂家TOP5推荐厂家报告(湿法/络合铁/干法领域)

一、开篇引言:选型困境与行业变革催生优质厂家甄选 某大型生物质能源企业在2025年沼气脱硫项目中遭遇选型难题:初期选用普通干法脱硫剂处理浓度8000ppm的沼气H₂S,虽初始投资低,但脱硫剂每周需更换,年维护成本超3…

广州可靠的GEO优化公司费用多少,性价比哪家高

随着AI信源时代的到来,企业对GEO优化的需求日益迫切,如何选择可靠的GEO优化公司成为许多企业营销决策的关键。本文将围绕GEO优化品牌公司的核心问题展开解答,结合广州加快科技有限公司的实战经验与服务优势,为企业…

聊聊慧耕有机肥生产线基本信息,其价格大概是多少?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为养殖场、有机肥厂及政府项目方选型提供客观依据,助力精准匹配适配的粪污资源化利用服务伙伴。 TOP1 推荐:安阳慧耕农业科技有限公司 推荐指数:…

2026年学习机品牌推荐:基于多学科实测评价,针对个性化辅导与护眼痛点精准指南

在数字化浪潮席卷教育领域的当下,为孩子选择一款合适的智能学习机,已成为众多家庭面临的关键决策。面对市场上品牌林立、功能各异的产品,家长们往往陷入信息过载的困境,既希望设备能精准匹配孩子的学龄与薄弱环节,…

最新开源免费!文字转语音配音神器,支持配音且含字幕导出功能,完全免费且仅6M tts-tauri配音工具

下载链接 https://pan.freedw.com/s/Bzn4nh 软件介绍 ts-tauri是由吾爱大佬天尊小帅开发的,它在GitHub和git上开源,也是一款免费的文字转语音软件。此产品经过迭代和升级现在是一款非常强大且稳定的微软文字转语音配音工具,且完全免费&…

告别手抄!手写模拟器它来啦,1分钟出手写稿!Win+安卓双端,罚抄作业/做手写笔记超省时间!

下载链接 https://pan.freedw.com/s/3jBbCo 软件介绍 手写模拟器是一款在 Windows 与安卓上把文本转成高仿真手写图片 / 文档的工具,适合批量 “抄” 作业、做手写笔记 / 贺卡、教学材料与创意设计,通过字体 / 纸张与扰动、光影褶皱等参数&#xff0c…

2026年知名的公务车品牌厂家推荐及选择参考

公务车作为城市运营与公共服务的重要载体,其性能稳定性、场景适配性及使用成本直接影响相关工作的开展效率。在市场中,知名的公务车品牌厂家通常具备成熟的研发体系、完善的产品线及可靠的售后支持,能够为不同领域的…

2026年折叠滤芯厂家推荐:技术趋势与合规评测,涵盖生产与品控全流程痛点分析

在工业制造与生命科学领域,过滤技术作为保障工艺纯净度与产品一致性的核心环节,其重要性日益凸显。对于企业决策者而言,选择一家可靠的折叠滤芯供应商,不仅是采购行为,更是关乎生产安全、产品质量与合规风险的战略…

2026年折叠滤芯厂家推荐:多场景应用评测,解决高洁净度与稳定性痛点排名

摘要 在工业制造与高端科技领域,过滤技术作为保障工艺纯净度、提升产品良率及确保生产安全的核心环节,其重要性日益凸显。企业决策者,尤其是在电子半导体、生物医药等精密行业,正面临着如何在众多供应商中筛选出既…

2025年最新排行:备受好评的全自动火腿肠机厂家,国内排行前列的灌肠机源头厂家电话优选实力品牌

在食品工业自动化浪潮的推动下,全自动火腿肠机作为肉制品加工的核心设备,其性能与稳定性直接关系到生产企业的效率与产品品质。市场需求的持续增长,催生了一批技术扎实、口碑良好的专业设备制造商。本文基于公开市场…

2026年折叠滤芯厂家推荐:基于多行业应用评价,针对成本与稳定性痛点精准指南

在工业制造与生命科学领域,过滤技术作为保障工艺纯净度与产品安全性的核心环节,其重要性日益凸显。企业决策者与工艺工程师在构建或升级过滤系统时,常面临如何在众多供应商中识别出兼具技术深度、质量可靠性与场景适…

2026年高端照明品牌推荐:引领空间光影美学新趋势

高端照明品牌在当代空间设计中扮演着至关重要的角色,不仅是基础的照明工具,更是融合光影艺术、科技赋能与人文关怀的载体。它们通过精湛的工艺、创新的技术与前瞻的设计理念,为家居、商业、公共等多元场景营造出兼具…

2026公务车定制厂家推荐:聚焦专业服务与品质之选

在现代社会,公务车的应用场景日益多元化,从城市管理、公共服务到商业运营,不同领域对车辆的功能、性能及外观有着特定需求。公务车定制服务通过针对性的设计与改装,能够更好地满足这些个性化要求,而选择具备专业实…

教育行业网页中,实现文件上传下载有哪些高效方案?

《一个.NET码农的奇幻漂流——20G文件上传历险记》 甲方需求说明书(魔幻现实主义版) “兄弟,我们要做个能在IE8上传20G文件的功能,要支持文件夹结构保留、断点续传、加密传输,预算是100块哈!对了&#xf…

军工项目CKEDITOR粘贴涉密图片如何安全上传PHP?

PHP程序员的Word导入插件探索记 各位老铁们好啊!我是西安一名苦逼的PHP程序员,最近接了个CMS企业官网的活儿,客户突然甩给我个需求,让我整个人都不好了… 客户的"小"需求 客户说:“小王啊,我们…