【Linux】详解Linux中的Makefile文件

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

一、Makefile文件介绍

Makefile文件是Linux中用于编译和链接的自动化 工具,是GNU工具(vi、gdb、makefile)的一部分。

为什么需要编写Makefile文件

程序的生成过程分为:编译期(源文件.c编译生成.o文件)和链接期(把所有.o文件链接生成可执行文件)。如果程序更新,下次生成可执行文件会对所有文件再次执行这个生成过程。因此需要Makefile文件,在修改源文件后,只编译修改后的文件,节省编译时间。

Makefile的执行原理

程序第一次编译时,会保存所有生成的中间文件.o文件,下次编译时只编译修改的源文件,重新生成.o文件,没有修改的.o文件无需再次编译,直接使用保存过的.o文件,一起链接生成可执行文件。

Makefile在编译期简化编译

如何判断源文件是否被修改?

通过比较源文件的修改时间和对应的.o文件的生成时间,如果修改时间更新,说明源文件被修改,需要重新编译。

Makefile文件的优点

  • 重用性强(一次编译终身受益),可以重复使用管理不同的项目
  • 能够更便捷地编译、管理代码,不用每次都重复书写复杂的编译命令
  • 只编译修改过的文件,节省编译时间

二、创建编写Makefile文件

命名:必须以makefile或Makefile命名

注释:#

执行Makefile文件:make

Makefile文件三要素

  • 1.目标:完成编译,生成可执行文件,可执行文件的名字就是目标
  • 2.依赖:源文件或者资源文件
  • 3.命令:根据依赖生成目标要执行的命令

编写makefile文件的格式:

bash 复制代码
目标:依赖
	命令

命令前面是一个Tab键

Makefile文件的注意事项

  • 自顶向下建立依赖关系
  • 默认只有一个最终目标(写在最上面),可以有多个中间目标

三、Makefile变量的定义和使用

1.自定义变量

没有数据类型,默认为字符串类型

变量名可以由字母、数字、下划线构成,不能以数字开头

为了与高级语言区分,一般使用全大写定义变量

使用变量:

bash 复制代码
	$(变量名)

2.内置变量

  • $@:表示目标名
  • $^:表示所有依赖项
  • $<:表示第一个依赖项

3.常用变量

bash 复制代码
#1.存储目标名
TARGET=myapp
#2.存储编译期版本
CC=gcc
#3.存储头文件路径
INCLUDE_PATH=../include
#4.存储库文件路径
LIBRARY_PATH=../lib
#5.存储安装路径
INSTALL_PATH=/user/bin
#6.存储编译选项
CFLAGS=-I$(INCLUDE_PATH) -c -Wall
#7.预处理选项
CPPFLAGS=-D

四、Makefile的内置函数和内建语法

1.wildcard

文件名处理函数:获取某个路径下的所有文件名

例如:获取当前路径下所有的.c文件名,存储到变量SOURSEFILE中

bash 复制代码
SOURSEFILE=$(wildcard *.c)

2.patsubst

字符串替换函数:在指定的文本中查找符合模式的字符串进行替换

例如:把变量SOURSEFILE中的所有.c文件改为.o文件

bash 复制代码
DFILE=$(patsubst %.c,%.o,$(SOURSEFILE))

3.内建语法

将.c文件编译成.o文件(头文件依赖在上层include文件夹中):

bash 复制代码
%.o:%.c
	gcc -c $< -I../include

五、Makefile的功能目标

功能目标没有依赖,只有命令

1.删除

bash 复制代码
clean:
	rm -rf $(DFILE) $(TARGET)

2.安装

bash 复制代码
install:
	sudo cp $(TARGET) $(INSTALL_PATH)

3.卸载

bash 复制代码
uninstall:
	sudo rm -rf $(INSTALL_PATH)/$(TARGET)

卸载时如果不小心多了空格,将会删除整个文件夹!可以先进行输出确认后再删除

4.输出

bash 复制代码
output:
	echo $(INSTALL_PATH)/$(TARGET)

|--------------------------------------|
| 大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |

|---------------------------------------------------------------|
| 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |

相关推荐
MZWeiei1 分钟前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper
丰色木夕10 分钟前
Ubuntu下的tcl/tk编程快速入门
ubuntu·tcl·tk
7yewh17 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
小张认为的测试21 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
打鱼又晒网29 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
biter008834 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
大妞36 分钟前
ubuntu20.04 install vscode[ROS]
ubuntu
良许Linux43 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
车轮滚滚__44 分钟前
uniapp对接unipush 1.0 ios/android
笔记
蜜獾云1 小时前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器