当前位置: 首页 > news >正文

Linux第五讲----gcc与g++,makefile/make

1.代码编译

1.1预处理

我们通过vim编辑完文件之后,想看一下运行结果这时我们便可以试用gcc编译C语言,g++编译c++.

编译代码:

上述两种方法均可,code.c是我的c语言文件,mycode是我给编译后产生的二进制文件起的名(随便起)(-o后面加可执行程序名)

下面我们来了解一下预处理的作用

输入如下内容

 解释:-E表示从现在开始进行程序的编译,当预处理完毕时,翻译工作就会停下来

code.c 文件在经过预处理后会形成一个二进制文件我们起名为code.i 。下面我们打开它看一下! 

由此对比,我们得出结论:预处理进行宏替换,去注释,条件编译,以及头文件展开,而在预处理之后,便没有了注释,也没有了头文件

 1.2 编译

输入如下内容,将code.i进行编译并生成汇编

-s表示 从现在开始进行程序的编译,编译完成就停下来

1.3 汇编

-c 表示 从现在开始进行程序的翻译,汇编完成就停下来

code.o为可重定位目标二进制文件,即重新填写目标函数在库中的地址,该文件机器可以识别,

1.4 链接

 生成可执行文件和库文件

linux中,动态库以.so结尾,静态库以.a结尾

2.库

2.1 动态库和静态库

首先是动态库,在windows中是以.dll为后缀,而在linux中是以.so为后缀,动态库形成动态链接

然后是静态库,在windows中是以.lib为后缀,而在linux中是以.a为后缀,静态库形成静态链接

2.2优缺点比较

动态库:

优点:节省资源

缺点:一旦丢失,所有程序无法直接运行,而且在运行时会稍微慢一点点

静态链接:

优点:不依赖任何库,自己就能独立运行

缺点:体积大,占据资源多(占磁盘空间,内存空间),加载速度受影响

3.make/makefile

3.1基本概念

make是一个Linux系统内置的命令,makefile是一个需要工程师自己建立的一个文件(m大小写都行)

3.2编写代码

我们创建一个makefile文件,并在文件中写入如下内容,注意,gcc前面的空格为TAB键!

 之后我们输入的make命令会自动寻找Makefile,也就是说make会解释makefile的命令并形成可执行程序,在这里叫code

 我们在make之后可以看一下会形成叫code的可执行程序

但是每次编译都会形成code文件清理起来比较麻烦,因此我们在Makefile文件在加一些东西

 

这样,当我们想清理时,直接make clean就行了 

3.3结论

code.c表示目标文件,而code.c和code是有依赖关系的,表示code依赖code.c,只有依赖关系+依赖方法结合在一起我们才能成功的编译

.PHONY:表示被修饰的目标是一个伪目标,而伪目标总是被执行的!

我们先来了解一下什么叫做不被执行

我们尝试输入几次make指令,会得到如下界面

这是因为我们第一次已经编译过这个文件了,再次编译时为了提升效率,便会提示这个,但是如果我们将Makefile改成这样在试试

 因此,可执行程序不要修饰成为PHONY,clean修饰成为总是执行的

而出现上述结果差异的原因我在后文中会讲述!

随后我们再看一下文件的详细信息,输入

得到

其中,Access表示最近被访问的时间(特殊)

modify表示文件内容最近修改时间

change表示文件属性的最近修改时间 

比如我现在将code.c的内容修改一下,

modify变了,但是change也变了,这是因为内容被修改时,他的属性也会变化 

再将权限改一下:

发现change改变了

那么make/makefile是怎么知道需不需要重新编译的呢?

由于源文件本身有一个modify时间,而可执行程序也有一个modify时间,需要对比二者的时间,如果源文件最新就要编,可执行文件最新就不用编,这也就是为什么前文make之后就不能在编译了而改一下源文件后又可以编译的原因

3.4 底层

我们将makefile的代码改一改,这样的

会发现这个依赖关系是一层一层的

3.5 注释 

在makefile中,注释用#,方法同上一篇博文

3.6打印

我们在makefile输入如下内容:

之后可以打印我们的内容

会有两个内容,但有一个是过程,也叫回显,我们不妨加个@关闭回显

这样我们便关闭了回显

3.7定义变量

 验证一下:

所以我们将代码改造一下:

 这样我们便可以按照所需改造代码了

简化:

$@代表$(BIN),$^代表$(SRC) (:右边的所有内容) 

所以最终我们将其写成这个形式

但是倘若我们有很多code.c,一次一次写很麻烦,所以我们改进一下:

wildcard 

 

(目标文件列表) 

这样就不用担心多个文件了

 

相关文章:

  • Halcon 算子-承接车牌识别
  • FPGA标准库-Open Logic
  • 376_C++_云透传,板端负责处理透传数据的API函数,用于实现客户端对设备内部接口的访问(VMS把数据直接传给板端内部)
  • 音频3A测试--AGC(自动增益)和NS(降噪)测试
  • 【监控】使用Prometheus+Grafana搭建服务器运维监控面板(含带BearerToken的Exporter配置)
  • 2024北京理工大学计算机复试上机真题
  • 《AJAX:前端异步交互的魔法指南》
  • 828华为云征文|使用sysbench对Flexus X实例对mysql进行性能测评
  • VirtualBox虚拟机MacOS从Big Sur升级到Sequoia(失败)
  • 软件架构师日常工作和核心技能
  • Keepalived 入门详解:高可用集群部署最佳实践!
  • 动静态库-Linux 学习
  • 拉拉扯扯adfda
  • 【c语言指针精选题】
  • 使用ast获取py文件中所有函数与类名
  • IPOIB 驱动中的发送完成处理机制
  • 深度集成DeepSeek,智问BI@GPT引领商业智能“深度思考“革命
  • 家政预约小程序用例图分析
  • 迷你世界脚本计时器接口:MiniTimer
  • 流程设计5原则与流程执行5要点
  • wordpress网站内容/品牌整合营销推广
  • 网站的版式/最近的新闻有哪些
  • 艺术视频手机网站可以做吗/厦门关键词排名seo
  • 干果坚果网站建设/网络销售的方法和技巧
  • 自己做淘宝返利网站/搜狗搜索网页版
  • 苏州制作网站的公司/网络营销工程师是做什么的