《linux编译器的使用gcc,g++》
创始人
2025-05-31 20:22:24

本文主要讲解编译的流程以及动静态库知识,以及项目自动化构建工具make/makefile

文章目录

  • 前言
  • 1、gcc和g++使用操作
    • (1)预处理
      • <1>头文件的展开
      • <2>去注释
      • <3>条件编译
      • <4>宏替换
    • (2)编译
    • (3)汇编
    • (4)链接
  • 2、 快速记忆
  • 3、谈谈链接
    • 动静态库
    • 对比实验
  • 4、 linux自动化构建工具(make/Makefile)


前言

gcc/g++是一个编译器。

我们程序的翻译有四个步骤

  1. 预处理(头文件展开条件编译宏替换去注释)
  2. 编译(形成汇编语言)
  3. 汇编(汇编->可重定位目标二进制文件(以.obj结尾),不可以被执行的,bin.obj)----只是把我们自己的代码进行翻译形成二进制目标文件
  4. 链接(将我们这自己形成的**.obj文件和库文件某种合并**,形成可执行程序)

1、gcc和g++使用操作

我们怎么编译文件

我们在编译的时候,使用gcc +文件名,就会形成一个可执行程序->a.out
在这里插入图片描述

如果我们想形成自己想要的名字的可执行程序,我们可以用-o选项,也就是gcc myfile.c o myfile,主要是记住-o后面直接跟我们要的可执行程序的名字
在这里插入图片描述

(1)预处理

预处理的作用:
  头文件展开,条件编译,宏替换,去注释.

在这里插入图片描述

怎么看到预处理的操作

gcc -E这个选项表示,从现在开始进行程序的翻译,预处理做完,就停下来。但是我们直接打印在屏幕上就太麻烦了,我们将它形成一个文件,就在使用 -o选项,所以最后的操作就是 gcc -E myfile.c -o myfile.i,就可以形成一个 myfile.i的文件,因为一般进行完预处理之后的文件就是用 .i进行后缀。
在这里插入图片描述

<1>头文件的展开

我们发现这个代码多出来800多行的代码,这个东西就是我们的头文件展开的内容,然后将内容复制到预处理的文件中。
所以这一步叫做头文件的展开
注:打开两个文件的操作,我在介绍vim的文章里面说了,在低行模式下输入vs+文件名即可
在这里插入图片描述

<2>去注释

我们发现注释没有了,这一步的操作就是去注释。
在这里插入图片描述

<3>条件编译

我们上面定义过PRINT,所以我们发现下面的就是剩下了PRINT,没有hehe,所以这一步就是条件编译
在这里插入图片描述

<4>宏替换

因为上面定义M是100,所以我们在进行预处理操作的时候,直接将M换成100,这个操作就是宏定义
在这里插入图片描述

(2)编译

编译的作用
  形成的汇编语言

操作
-S:从现在开始进行程序的翻译,当编译做完,就停下来。
gcc -S myfile.i -o myfile.s,默认形成 myfile.s的文件
在这里插入图片描述

(3)汇编

汇编的作用:
汇编代码->可重定位目标二进制文件,不可以被执行的,
就是将我们上一步的汇编代码翻译为二进制文件.obj结尾的文件)

只是把我们自己的代码进行翻译形成二进制文件目标,就是形成.obj文件
操作:gcc -c myfile.s -o myfile.o,默认形成.o文件。

打开文件,就是一堆乱码。
-c,从现在开始进行程序的翻译,当汇编做完,就停下来
在这里插入图片描述

(4)链接

链接的作用
将我们这自己形成的.obj文件和库文件某种合并,形成可执行程序

可以直接进行链接,看下面操作
gcc myfile.o -o myfile,就形成了可执行程序myfile
注:使用./myfile 即可对该执行该程序
在这里插入图片描述

2、 快速记忆

我们的选项合起来就是ESc,就是前三个操作的选项,我们只需要记住,前两个字母是大写就可以了。

我们三个操作形成的文件后缀是 ,.iso。一些镜像文件就是iso,我们不是ios,记住千万不要记混。

3、谈谈链接

新命令
ldd+可执行程序,检测这个可执行程序在当前被形成的时候,都依赖那些库
在这里插入图片描述

我们为什们能够在我们 linux下,进行 c的编写呢?
  linux系统默认携带了语言级别的 头文件和 语言对应的库!

动静态库

库分两种-----库本质就是文件
  1.静态库 libXXXXX.a(专门让编译器,对用户的程序进行静态链接的)
  2.动态库lib.XXXX.so(专门让编译器,对用户的册程序进行动态链接的)
文件的名字怎么看呢?
  前缀lib XXXX后缀.a我们去掉前缀,去掉后缀,剩下的就是我们的名字。

静态库和静态链接

链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我们所需要的代码到我自己的可执行程序中
静态链接成功:我们的程序,不依赖任何库,自己就可以独自运行
静态库的缺点:
  因为自身拷贝的问题,比较浪费空间

动态库和动态链接

链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我们所需要的代码的地址到我自己的可执行程序中
动态链接成功:我们的程序,还是依赖库,一但动态库缺失,我们的程序就无法运行
动态库的优点:
因为可以做到可以被大家共享,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间。

总结:

  • 函数库一般分为静态库和动态库两种
    • 静态库是指在编译连接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时就不再需要库文件了
    • 动态库,在编译连接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。
    • 动态库并不写入具体库函数的实现代码,而是在可执行程序中记录了函数符号信息表,多个程序在内存中可以使用用一个库,所以内存中的代码冗余较小。
    • gcc默认的就是动态链接

对比实验

动态链接
在这里插入图片描述

静态链接,我们先用这个命令创建静态链接gcc myfile.c -o myfile-static -static
在这里插入图片描述

4、 linux自动化构建工具(make/Makefile)

make:是一个命令
makefile:是一个文件,这个文件在当前的源代码路径下。

make是命令工具,makefile是一个文件,两个搭配使用,完成项目自动化构建。

怎么自动化编译代码
1.快速写一个 demo
2.规则

(1)快速写一个demo

先创建一个makefile文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)细节

makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译关系
完成一件事情,必须要有正确的依赖关系和依赖方法

我们上面makefile的内容如下图
在这里插入图片描述

依赖关系
testfile:test.c这个就是依赖关系,根据 test.c依赖文件 ,形成 testfile目标文件。形成 testfile依赖于 test.c

依赖方法
gcc test.c -o testfile,根据这个依赖方法,形成目标文件。

注意
1.目标文件对应的依赖文件列表可以是空
2. makefile 在进行从上到下的扫描的,只会进行最开始的目标文件。第二个或者之后的并不会直接实现的

.PHONY作用
总是被执行的。
被它修饰的东西就叫做 伪目标
所以我们可以发现,在上面这个 makefile,我们的 clean被他修饰,所以我们的 clean可以一直执行,但是在我们形成目标文件,没有被他修饰,在执行完一次后,目标文件是最新的,我们就不能在进行执行了。如果进行修改,就还可以在执行。

我们知道了上面的知识,我提一个问题,系统怎么知道我们形成目标文件是最新的

就是看时间,系统会比较源代码的时间和可执行程序的时间
如果正常的话,我们的可执行程序的时间是比源代码的时间快,所以我们就不能执行了。
但是如果我们修改了,我们就又可以执行了
在这里插入图片描述

相关内容

热门资讯

上交所最新上市发审动态揭保荐机... 导读:在这份《最新审核动态》,上交所也按照惯例通报了在IPO审核过程中发现带病闯关上市的两大监管案例...
股票行情快报:XD永吉股(60... 证券之星消息,截至2025年6月3日收盘,XD永吉股(603058)报收于7.92元,上涨1.15%...
“稳定币”概念股暴涨背后:三重... 本报(chinatimes.net.cn)记者卢梦雪 北京报道 美国《GENIUS法案》通过,香港《...
稳定币突然爆火,对我们有啥影响... 节前,其实有一件大事发生。那就是,香港政府在宪报上刊登了《稳定币条例》。《稳定币条例》正式成为法例,...
“童装第一股”五年亏掉5亿,深... 来源 | 深蓝财经撰文 | 杨波“童装第一股”,安奈儿的老板这回真不想干了。6月3日,安奈儿刊发关于...
成都天府机场外一辆新能源车着火... 来源 | TcehWire6月3日上午,有多位网友发视频称,四川成都天府机场T2航站楼外道路上一辆新...
三四千家都在卖?零公里二手车是... 说起最近的汽车市场,相信一个很神奇的名词突然爆火,这就是零公里二手车,零公里和二手车这两个看上去完全...
一年融资三轮,这家半导体公司获... 5月,证监会官网新增披露17家企业进行IPO辅导备案。至此,2025年新增披露123家企业辅导备案。...
有个股收益率突破2000%!港... 2025.06.03本文字数:2443,阅读时长大约5分钟作者 |第一财经 王方然"叮!"——一声信...
原创 特... 近期,美国联邦巡回上诉法院批准恢复执行特朗普的关税政策,这一消息瞬间吸引全球目光,再次将特朗普的关税...
布局无尽能源:这7家能源公司正... 中核集团透露,近日,新一代人造太阳“中国环流三号”实现百万安培亿度H模,即同时实现等离子体电流100...
全球及中国2MHz核磁共振岩芯... 全球及中国2MHz核磁共振岩芯分析仪行业动态规划及投资机遇调研报告2025-2031年 【全新修订...
李在明出口民调大幅领先 新总统... 新华社首尔6月3日电 韩国第21届总统选举3日正式投票。根据三大电视台在投票结束后公布的联合出口民调...
中国太保发布500亿战新并购基... 6月3日,中国太保正式发布总规模500亿元的太保战新并购基金与私募证券投资基金。上海市委常委、常务副...
6月4日A股投资避雷针︱电声股... 电声股份股东赏睿集团、曾俊、周晓露拟减持合计不超5%股份;博深股份董事陈怀荣拟减持不超1.38%股份...
年初以来上涨8.3%!渣打人民... 6月3日,渣打人民币环球指数(RGI)最新报告显示,该指数2025年前4月连续上行,升至八个月以来高...
董宇辉首次与省委书记互动,意义... 成为“老板”不到一年的董宇辉,和政界的互动达到了新高度。据《广西日报》报道,6月3日,广西壮族自治区...
21 深度丨国投证券高层再变阵... 21世纪经济报道记者李域 深圳报道国投证券高层人事变动还在持续。近日,五矿集团官网最新信息显示,原国...
*ST京蓝遭二次立案!信披违规... 记者 黄敏2025年5月31日,京蓝科技股份有限公司(*ST京蓝,证券代码:000711)发布关于收...
*ST恒立信披违规遭查,业绩预... 记者 秦楚远2024年8月16日,恒立实业发展集团股份有限公司(以下简称“*ST恒立”,代码0006...
华菱钢铁:5家投资者合计向硅钢... 华菱钢铁(000932.SZ)6月3日晚间公告披露,为加快推进公司硅钢项目建设,通过在湖南省联交所公...
央行多措并举稳资金 六月流动性... 为保持银行体系流动性充裕,中国人民银行日前发布公告称,5月央行以固定数量、利率招标、多重价位中标方式...
国产EDA概念股爆发,概伦电子... 6月3日,EDA概念股爆发。 截至收盘,概伦电子(688206.SH)涨近10%,盘中一度涨逾14%...
电商运营:2024年中国化妆品... 今天分享的是:电商运营:2024年中国化妆品年鉴 报告共计:509页 《2024 年中国化妆品年鉴》...
远见丨商业热点观察:中企“数字... 本期话题:随着全球化竞争格局的深刻变革和AI技术革命渗透,中国企业的“出海”战略也在加快。伴随商品、...
小米汽车一季度亏损收窄至5亿,... 6月3日,小米创始人雷军在小米投资者大会上表示,小米汽车业务亏损正在逐步收窄,预计在今年第三、四季度...
官宣!朱江涛获任招商证券总裁,... 6月3日盘后,招商证券发布《第八届董事会第二十次会议决议公告》,其中披露,董事会同意聘任朱江涛先生担...
招商银行原副行长朱江涛接任,招... 朱江涛担任总裁,招商证券管理层迎新。招商证券(600999.SH)6月3日公告称,聘任朱江涛担任总裁...
全球财经连线|贸易风向牵动全球... 南方财经记者李依农 上海报道全球市场再度受到贸易风向牵动。据央视新闻报道,美国总统特朗普宣布将把进口...