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

Makefile基础应用

1 使用场景

        在Linux环境下,我们通常需要通过命令行来编译代码。例如,在使用gcc编译C语言代码时,需要使用以下命令。

gcc -o main main.c

        使用这种方式编译代码非常吃力,每次调试代码都需要重新在命令行下重新编译,重复度劳动太多,特别是在大型项目中,源文件数量较多时,需要将可执行程序依赖的源文件一一列举,徒增工作量。在这种情况下,使用makefile可以帮助我们一键完成编译,从而省下很多时间。

2 使用方式

2.1 makefile文件的编写

        首先我们需要进行makefile文件编写。在源文件所在目录下创建一个名为makefile或Makefile的文件,并按如下示例编写文件。

main:main.c func.cgcc -o main main.c func.c

        该makefile文件的第一行为一个依赖关系,冒号左侧为该依赖关系所生成的文件,而冒号右侧为其所依赖的文件。若该makefile文件所在路径下存在main.c和func.c文件,则可以在当前目录下使用make命令,使makefile执行该依赖关系后的指令,将他们编译生成main文件。

make

        makefile文件中也可以存在多个依赖关系,例如下列逐步编译。在这个文件中,若直接使用make指令,则makefile会以第一行依赖关系为基准,先生成main所依赖的main.o。同理,由于main.o依赖于main.s,那么会先生成main.s,以此类推,逐步生成。

main:main.ogcc -o main main.s
main.o:main.sgcc -c main.s -o main.o
main.s:main.igcc -S main.i -o main.s
main.i:main.cgcc -E main.c -o main.i

        这样做的好处是可以控制makefile自动编译的编译进度。假设我们只需要生成其中的main.o文件,我们可以通过以下指令获得。那么makefile只会编译到main.o,而不会继续向后生成main。

make main.o

        事实上,直接使用 make 指令就相当于直接执行 makefile 文件中的第一个依赖关系。

2.2 伪目标

        使用 makefile 时,为了避免重复编译,makefile 会判断所执行的依赖关系是否更新。若源文件未更新,则不会执行依赖关系,从而提高编译效率。

        若想强制执行,则需要将该依赖关系设为伪目标,如下。

.PHONY:main
main:main.cgcc -o main main.c

        伪目标多用于删除已生成的文件,如下,其中 clean: 同样为依赖关系。

main:main.cgcc -o main main.c.PHONY:clean
clean:rm -f main

        这样,我们就可以使用 makefile 实现快速编译和删除了。

make clean

http://www.lryc.cn/news/490362.html

相关文章:

  • 计算机网络基础全攻略:探秘网络构建块(1/10)
  • SpringMVC-Day1
  • 【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题
  • 探索 RocketMQ:企业级消息中间件的选择与应用
  • vue中v-if和v-for优先级
  • 使用Kotlin写一个将字符串加密成short数组,然后可以解密还原成原始的字符串的功能
  • windows C#-取消任务列表(上)
  • Linux---ps命令
  • 解决k8s拉取私有镜像401 Unauthorized 问题
  • Ruby 模块(Module)
  • HAL库的简单介绍以及环境搭建
  • 如何在 PyCharm 中配置 HTTP 代理以确保网络连接的顺畅性
  • PHP 8.4 重磅发布了
  • LVM缩容
  • Next.js 独立开发教程(三):CSS 样式的完整指南
  • React (三)
  • Python数据结构之链表
  • “LLM是否是泡沫”
  • 基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
  • 算法(Algorithm)
  • C语言中const char *字符进行切割实现
  • 【UE5】在材质中计算模型在屏幕上的比例
  • 前端速通(HTML)
  • 订单日记为“惠采科技”提供全方位的进销存管理支持
  • Linux:文件管理(一)
  • 鸿蒙多线程开发——线程间数据通信对象03(sendable)
  • linux从0到1——shell编程7
  • 自主研发,基于PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发的不良事件管理系统源码,不良事件管理系统源码
  • 【海思Hi3519DV500】双目网络相机套板硬件规划方案
  • 【电源专题】BUCK电源SW电压的平均值为什么等于输出电压?