【C/C++】Makefile文件的介绍与基本用法

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

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

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

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

c语言内容💖:

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

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


目录

Makefile 介绍:

Makefile 是被用于自动化构建过程的脚本文件,对一个项目具有高可用性可重用性

Makefile 描述了如何从一个或多个源文件编译、链接和生成目标文件或可执行文件

可以通过使用 make 命令方便地编译和重新编译项目,而无需手动执行每个构建步骤。

源代码的编译过程

在我们编写完代码之后的.c文件被称为源代码文件,此时是代码的预处理期。

  • 编译期:在我们按下调试键后,编译软件中的编译器会将我们的源代码进行编译,成为汇编语言,如果我们在书写代码中有语法等错误,在编译时编译器将不会通过,会报出以C为开头的错误(编译:compile)即为编译错误。
  • 汇编期:在经过汇编期后,汇编语言会由汇编器转化为真正的机器语言即01指令,生成.obj文件(目标文件),通过对代码调试反汇编可以看到,我们的一句代码在机器语言中对应了很多行的机器语言。
  • 连接期:通过连接器计算机将一些.obj文件整合到一起,通过头文件(库函数)连接到一起,打包组成了最终的exe可执行文件。如果出现了LNK错误即是连接期出现了问题,可能是main函数出现错误(一个项目没有或者有多个main函数)或者缺少头文件。执行期即执行该exe文件。

Makefile 的基本语法:

Makefile 一般包含:

  • 显式规则:显式规则说明如何生成一个或多个的目标文件。明显指出要生成的文件,文件的依赖文件,生成的命令。 TARGET 变量定义了最终生成的可执行文件的名称。

  • 变量定义:在 Makefile 中可以定义一系列的变量,变量一般都是字符串,当 Makefile 被执行时,变量的值会被扩展到相应的引用位置上。

  • 文件指示:其包括了三个部分,一个是在一个 Makefile 中引用另一个 Makefile,就像 C 语言中的 include 一样;另一个是指根据某些情况指定 Makefile 中的有效部分,就像 C 语言中的预编译#if 一样;还有就是定义一个多行的命令。

  • 注释:Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,使用"#"字符

  • CC 变量定义了要使用的编译器(在这里是 gcc)。

  • SRCS 变量包含所有的源文件,OBJS 变量则是从 SRCS 变量中的 .c 扩展名替换为 .o 得到的,代表目标文件。

  • all 是默认目标,当运行 make 命令时,它会首先尝试构建这个目标。all 依赖于 $(TARGET),即它会尝试构建可执行文件。

  • (TARGET): (OBJS) 描述了如何从目标文件生成可执行文件。使用了 $(CC) 变量定义的编译器,并将所有的目标文件链接起来生成可执行文件。

  • %.o: %.c 描述了如何从 C 源文件编译生成目标文件。 < 代表依赖项(源文件), < 代表依赖项(源文件), <代表依赖项(源文件),@ 代表目标(目标文件)。

  • clean 目标是一个常用的清理规则,用于删除生成的目标文件和可执行文件。使用 make clean 命令执行


示例

main.c 生成可执行文件 app 的 makefile 文件示例:

bash 复制代码
# 定义gcc编译器  
CC=gcc  
  
# 定义源文件和目标文件  
SRCS=main.c 
OBJS=$(SRCS:.c=.o)  
TARGET=app
  
# 默认目标:all  
all: $(TARGET)  
# 链接目标文件以生成可执行文件  
$(TARGET): $(OBJS)  
 $(CC) $(OBJS) -o $(TARGET)  
# 从源文件编译生成目标文件  
%.o: %.c  
 $(CC) -c $< -o $@  
# 清除生成的目标文件和可执行文件  
clean:  
 rm -f $(OBJS) $(TARGET)
bash 复制代码
CC=gcc  
CFLAGS=-Wall -g  # 添加编译选项  
  
# 使用通配符获取所有.c文件  
CFILES=$(wildcard *.c)  
OBJS=$(CFILES:.c=.o)  
  
# 默认目标:all  
all: app  
  
# 链接目标文件以生成可执行文件  
app: $(OBJS)  
    $(CC) $(CFLAGS) -o app $(OBJS)  
  
# 从源文件编译生成目标文件  
%.o: %.c  
    $(CC) $(CFLAGS) -c $< -o $@  
  
# 清除生成的目标文件和可执行文件  
clean:  
    rm -rf hello *.o

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

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

相关推荐
酉鬼女又兒1 分钟前
零基础快速入门前端Web存储(sessionStorage & localStorage)知识点详解与蓝桥杯考点应用(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·html
Bert.Cai3 分钟前
Python集合简介
开发语言·python
tryCbest7 分钟前
Java和Python开发项目部署简介
java·开发语言·python
ZTLJQ7 分钟前
任务调度的艺术:Python分布式任务系统完全解析
开发语言·分布式·python
小Tomkk8 分钟前
怎么配置 Visual Studio Code 配置 C/C++
c语言·c++·vscode
阿里嘎多学长8 分钟前
2026-03-31 GitHub 热点项目精选
开发语言·程序员·github·代码托管
CheerWWW11 分钟前
C++学习笔记——枚举、继承、虚函数、可见性
c++·笔记·学习
小只笨笨狗~17 分钟前
解决objectSpanMethod与expand共存时展开后表格错位问题
开发语言·javascript·ecmascript
比昨天多敲两行22 分钟前
C++ AVL树
开发语言·c++
小糯米60128 分钟前
C++ 并查集
java·c++·算法