【Linux】gcc/g++编译器、make/Makefile自动化构建工具

news2024/9/23 1:20:10

 作者:小卢

专栏:《Linux》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》

目录

  1.gcc/c++的概念:

2.程序编译过程详解:

2.1程序编译过程:

2.2gcc指令: 

2.3在Linux中如何实现四种过程

2.3.1如何直接生成可执行程序呢?

 2.3.2预处理过程:

 2.3.3编译过程:

2.3.4汇编过程:

2.3.5链接过程:

 3.动态库和静态库:

3.1动态库和静态库的区别:

3.2linux中如何区别静态库和动态库:

​编辑3.3如何进行静态链接:

 4.make/Makefile自动化构建工具

4.1依赖关系&&依赖方法:

4.2清理:

 4.3使用make不成功的常见原因及解决方法:


  1.gcc/c++的概念:

gcc/g++为Linux中的编译器。

2.程序编译过程详解:

2.1程序编译过程:

程序编译分为四个过程:

1.预处理   2.编译     3.汇编       4.链接

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

2.2gcc指令: 

gcc 选项 编译后的文件 编译的文件

后面会有演示。

2.3在Linux中如何实现四种过程

2.3.1如何直接生成可执行程序呢?

gcc 文件名 可以将文件直接编译成一个a.out的可执行程序

当需要生成一个需要由指定文件名的可执行程序如何操作呢?

-o为目标文件

gcc -o myfile myfile.c 

 2.3.2预处理过程:

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。

“.i”文件为已经过预处理的C原始程序

“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

gcc -E myfile.c -o myfile.i 

 可以对比一下预处理过后两者的代码:

 2.3.3编译过程:

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。

“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

编译操作可以从.c文件开始,也是从点.i文件。

gcc -s myfile.i -o myfile.s

2.3.4汇编过程:

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了 

gcc -c myfile.s

2.3.5链接过程:

 在成功编译之后,就进入了链接阶段。

gcc -c myfile.s -o myfile.o


 3.动态库和静态库:

3.1动态库和静态库的区别:

概念引入:

 你是一名刚上高中的学生,你在上高中前就向振华中学的学长打听了网吧的位置,你的学长跟你说:校门口出去往右走两百米就可以看见一件网吧。你来了振华中学一两个星期了,当周六日的时候,你写完了数学和英语作业,你想先出去上网打一会永劫无间放松放松再回来写物理作业和化学作业。因此你就这么干了。

网吧有很多个电脑,你每次去网吧都是不同的机子,每台机子都是每个人都可以去上网的,因此这台机子是共享机子。

当你爸爸因为你考了年级第一时,给你买了改电脑,你可以用你自己的电脑来打永劫无间放松了。你不再需要去网吧了,有一天这个网吧被举报了,大家不可以去上网了,但你有你自己的机子因此你不受影响。

你自己的机子相当于静态库,而网吧的机子相当于动态库

那静态库比较好?两者的区别呢?

  • 1.库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器, 对用户的程序进行动态链接的)
  • 2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中
  • 3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位
  • 4.静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行
  • 5.动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行!
  • 6.静态库,因为自身拷贝的问题,比较浪费空间
  • 7.动态库:因为可以做到被大家共享方法,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间
  • 8.静态库vs动态库: Linux默认使用的是动态链接和动态库!
     

3.2linux中如何区别静态库和动态库:

 静态库和动态库两者的表示不同:

1.静态库: libXXXXXX.a
2.动态库: libXXXXXX.so


3.3如何进行静态链接:

-static 静态链接选项

gcc myfile.c -o myfile-static -static

使用静态链接是需要有静态库的,当没有静态库时,会出现下面这种情况

如何安装静态库?

sudo yum install -y glibc-static 


 4.make/Makefile自动化构建工具

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

4.1依赖关系&&依赖方法:

  • 将myfile.c变为myfile,称为依赖关系
  • gcc那一行叫做依赖方法

4.2清理:

clean:换行后删除语句 

但是一般我们这种clean的目标文件,我们将它设置为伪目标

用 .PHONY 修饰,伪目标的特性是,总是被执行的。

 4.3使用make不成功的常见原因及解决方法:

当你文件已经是最新版本时,系统就认为你不需要在进行make操作就会报这样的报错

如果我们想要make的话,需要将源文件改一下然后再make就可以成功啦

 我们可以通过时间来判断文件是否是最新的!

stat 文件名 可以查看时间

touch可以更改为最新时间

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

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

相关文章

微电网(风、光、储能、需求响应)【Simulink 仿真实现】

目录 1 展现 2 典型几个介绍 2.1 采用PR的三相逆变器电压控制 2.2 太阳能直流微电网系统 2.3 主电网故障时的交流微电网性能 2.4 混合光伏、双馈发电和电池能源的微电网集成 3 写在后面 4 完整资源 1 展现 随便打开一个,就以第一个(采用PID的三…

【GD32F427开发板试用】macOS/Linux系统开发环境搭建(开发、编译、烧录、调试)

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:HonestQiao 我日常的工作环境使用的是macOS系统或者Linux系统,万不得已才使用Windows。 GD32官方提供了Keil MDK-ARM和IAR两款工具…

如何使用Dx命令将jar打包成Dex,需要使用D8命令

使用dx打包的完整命令,将D:\ssh1.0.jar打包成MyClass.dex,MyClass.dex将会输出在当前CMD命令窗口的目录下。dx --dex --no-strict --min-sdk-version26 --outputMyClass.dex D:\ssh1.0.jar运行结果:不要使用dx命令,打出来的dex可以…

NestJS 项目实战 技术选型 (文末附视频)

前言 通过上一章的学习,我们了解了网关系统,并且针对要做的功能做了项目架构设计与需求拆解。 那在一个项目正式开发之前,我们还需要做一个技术调研,从开发框架、使用的工具、数据库等等进行一系列的预研,避免在业务…

嘿~ 基于分布式架构的技术交流社区(WhiteHoleV0.7)即将竣工!

文章目录前言项目介绍WhiteHole期望立项作者功能/模块简介用户模块问答模块社区模块博文模块Next前言 拖更,拖延了这么久,耗时超过3个月的项目,WhiteHoleV0.7 版本即将迎来最后的收尾工作。当然考虑到服务成本,和开发进度&#x…

【以太网硬件十九】SGMII到底能不能直接出光模块?

SGMII接口到底能不能直接出光模块?先说结论:我认为可以,但是有限制,此时的光口只支持强制模式,不支持自协商。如果对端是1000base-X接口,对端也需要把自协商关闭才能与SGMII直出的光口建立连接。为什么SGMI…

你是真的“C”——C语言详解求素数n种境界~

详解C语言函数模块知识(下篇)😎前言🙌必备小知识~😘C语言详解《试除法》求解素数🙌试除法第一层境界~ 😊试除法境界2~😊试除法境界3~😊试除法境界4~😊C语言详解《筛选法》…

为何限制英伟达出售GPU芯片?中国的AI技术领先,让美国怕了

2022年下半年美国突然要求GPU芯片领军者NVIDIA停止对中国出售高端GPU芯片,此举让人疑惑不解,近期日本媒体《日本经济新闻》与荷兰的一家学术信息巨头的分析给出了答案,中国在AI技术上已领先于美国,而NVIDIA的高端GPU芯片有助于中国…

Web端即时通信技术-WebSocket

最近在做项目的时候,遇到了一个前端页面需要实时刷新的功能,一种方法是我们通过短轮询的方式,但这种方式虽然简单,但是无用的请求过多,占用资源,并且如果是对数据要求高较高的场景,就不适用了。…

汽车ECU软件开发之应用层软件与底层软件

随着汽车产品日渐趋向电子化,人们对各类先进的安全系统、高级驾驶辅助系统的接受程度日益提升。而原本昂贵的盲点检测、自动紧急制动等功能的成本下滑,使其快速获得了市场青睐。富士奇美拉研究所(Fuji Chimera Research Institute&#xff09…

MySQL算术/比较/逻辑/位/运算符与正则全解

文章目录1. 算术运算符加法与减法运算符乘法与除法运算符求模(求余)运算符2. 比较运算符等号运算符安全等于运算符不等于运算符非符号类型的运算符空运算符非空运算符最小值运算符最大值运算符BETWEEN AND运算符IN运算符NOT IN运算符LIKE运算符ESCAPEREG…

〖金融帝国实验室〗(Capitalism Lab)v8.2.00官方重大版本更新(2023.01.17正式发布)

〖金融帝国实验室〗(CapLab)v8.2.00正式发布! ————————————— ※v8.2.00更新内容摘要: 1.新增生活服务业:快餐店、比萨店、蛋糕店和咖啡店。 2.可以通过在农场周围购买土地并耕耘来实现产能扩容。 3.…

九龙证券|重磅会议召开,工信部强调推进民爆行业高质量发展

工信部强调推动民爆职业高质量开展,民爆概念股午后拉升。 工业和信息化部举行 民爆职业安全出产视频会议 据工信部网站,1月17日,工业和信息化部举行民爆职业安全出产视频会议。 工业和信息化部副部长徐晓兰表明,部党组对安全出…

【Linux操作系统】环境变量和命令行参数

文章目录一.环境变量1.什么是环境变量?2.windows下配置PATH环境变量的原理3.一览常见的环境变量4.指令方式如何查看环境变量5.PATH-存放系统默认搜索路径的环境变量6.两种方法使运行我们写的可执行程序不带路径二.环境变量和本地变量三.和环境变量相关的命令1.echo:…

元组的操作

1 元组的定义: 元组就是用一对小括号括起来的多个元素的有序集合,个元素之间用逗号隔开。 2 元组的创建: 2.1 使用()创建元组对象。例:lt(12,34,"one") 2.2 使用内置方法tuple创建元组对象。…

mysql 为什么说加上了索引,查询速度就快了呢?(文末附视频)

一天,老板跟我们提出说网站访问的速度太慢,要求我们尽快优化一下。我赶快去查询了一下,发现有几条 SQL 查询的时间异常,我相信这个时候很多小伙伴的大脑里浮现出来的第一个解决办法就是:加索引。 那么到底什么是索引呢…

字符加密-C语言实现

任务描述 请编写程序将一串5个字符组成的英文字符串译成密码,规则为:例如,将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母A后面第4个字母是“E”,用“E”…

虚拟电厂负荷控制系统三维可视化监控 | 数字孪生

随着国家“双碳”及“构建以新能源为主体的新型电力系统”等目标的提出,清洁化、数字化越来越成为电力系统面临的迫切需求,负控系统的发展对电力营销现代化建设具有重要的意义。负控管理系统是一个着眼于全面加强电力信息管理的,集负荷控制、…

FMC子卡设计方案原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡

FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡一、产品概述 ADRV9002 是一款高性能、高线性度、高动态范围收发器,旨在针对性能与功耗系统进行优化。该设备是可配置的,非常适合要求苛刻、低功耗、便携式和电池供电的设备。ADRV9002 的工作频率为 …

我的2022年度总结

今天是腊月廿七,又到了写年度总结的时候了,这是写年度总结的第七个年头,希望可以一直坚持写下去。今年是新冠疫情的第三年,疫情管控结束了,同时疫情流行也开始了。我在北京刚全面放开的时候就阳了。用了差不多一周多的…