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

Makefile编写和相关语法规则

makefile基本概念

Makefile 本质上是一个文本文件,它包含了一系列规则和指令,用于告诉构建工具(如 make)如何编译和链接程序,以及如何处理项目中的各种文件。其核心思想是通过定义目标(target)、依赖关系(dependencies)和生成目标的命令(commands),来实现项目的自动化构建。

makefile编写

makefile文件编写,就是要明确基础格式如下:

目标:依赖
(tab键)命令

举个具体的小例子:

main:main.c add.c
# 使用gcc编译器将main.c和add.c这两个源文件进行编译和链接操作,
# 最终生成一个名为main的可执行文件。
	gcc -o main main.c add.c

严格按照上述的基础格式写,但是这里有一个问题:如果我们得更新add.c中的代码,相应的两个文件都得重新先.c文件编译生成.o文件,再由.o文件链接成linux操作系统的可执行文件,如果一个大工程有上百个文件这样的代码处理起来太过于冗余。所以我们可以把每个文件的编译过程拆开。

第一版本

main:main.o add.o
    # 链接命令,将 main.o 和 add.o 链接生成可执行文件 main
    gcc main.o add.o -o main
main.o:main.c
    # 编译命令,将 main.c 编译为目标文件 main.o
    gcc -c main.c -o main.o
add.o:add.c
    # 编译命令,将 add.c 编译为目标文件 add.o
    gcc -c add.c -o add.o

上述写法,当更新 add.c 文件时,确实能够更智能地处理编译和链接过程,避开第一个版本的一些缺点,就不必重复重新执行gcc -c main.c -o main.o这条指令。

但是,Makefile有相应的语法规则,帮助我们写出更加简洁的代码;
比如,

  1. 我们可以自定义变量,a = b,$(a)来替代b;
  2. $<就对应着 “依赖文件列表” 中的第一个文件;
  3. $@就对应着"目标文件";
  4. gcc 可以用专门符号$(CC)表示;
  5. 而且类似的func.o: func.c这种.o和.c转换的语句太过于冗余,这里可以使用%.o:%.c去替代所有当前文件夹下.c文件编译得到.o文件
  6. $^表示当前规则的所有依赖文件,以空格分隔。如果依赖文件中有重复的,重复的文件只会出现一次。

所以根据上述规则,假设main用target代替,main.o add.o用object替换,我们可以得到下面的版本。

第二版本

 target=main
 object=main.o add.o
 CC=gcc
 $(target):$(object)
 	$(CC)  -o $@ $^
 %.o:%c
 	$(CC) -c $<

得到上述版本,已经非常简洁了,但是还是有个问题,我们想要得到的是Linux可执行文件main,中间还生成了.o文件,所以我们还可以更精益求精些,删除这些中间文件。

第三版本

 target=main
 object=main.o add.o
 CC=gcc
 $(target):$(object)
 	$(CC)  -o $@ $^
 %.o:%.c
 	$(CC) -c $< 
clean:
    rm -f $(object)

最后这个版本就可以利用简洁代码实现,main.c add.c文件编译链接生成可执行文件main,并且删除中间生成的冗余文件

相关文章:

  • C语言综合案例:学生成绩管理系统
  • Go语言学习笔记(三)
  • 【Go】十六、protobuf构建基础服务信息、grpc服务启动的基础信息
  • 可以免费无限次下载PPT的网站
  • 事务性质ACID
  • 若依vue plus环境搭建
  • 重构MVC
  • drupal可以自动将测试环境的网页部署到生产环境吗
  • C++17中方便文件操作的工具包filesystem-250227
  • Three.js包围盒
  • React低代码项目:问卷编辑器
  • 开发工具和库的一些介绍
  • 鸿蒙HarmonyOS NEXT开发:组件-样式-基础 2
  • 使用sympy实现傅里叶变换
  • 30.[前端开发-JavaScript基础]Day07-数组Array-高阶函数-日期Date-DOM
  • VMware Fusion 虚拟机Mac版 安装CentOS 7 系统
  • Tailwind CSS 4【实用教程】
  • Linux 下使用tracepath进行网络诊断分析
  • 11.24 SpringMVC(1)
  • 点云 PCL 滤波在自动驾驶的用途。
  • 柬埔寨果农:期待柬埔寨榴莲走进中国市场
  • 倒票“黄牛”屡禁不绝怎么破?业内:强化文旅市场票务公开制度
  • 特朗普:将于19日分别与普京和泽连斯基通话
  • “先增聘再离任”又添一例,景顺长城基金经理鲍无可官宣辞职
  • 没有握手,采用翻译:俄乌三年来首次直接会谈成效如何?
  • 全国省市县国土空间总体规划已基本批复完成,进入全面实施阶段