【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

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

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

相关推荐
星星法术嗲人10 分钟前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
yunhuibin14 分钟前
ffmpeg面向对象——拉流协议匹配机制探索
学习·ffmpeg
Ljubim.te16 分钟前
软件设计师——数据结构
数据结构·笔记
hengzhepa24 分钟前
ElasticSearch备考 -- Search across cluster
学习·elasticsearch·搜索引擎·全文检索·es
黑不溜秋的24 分钟前
C++ 语言特性29 - 协程介绍
开发语言·c++
一丝晨光29 分钟前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
天上掉下来个程小白31 分钟前
Stream流的中间方法
java·开发语言·windows
xujinwei_gingko42 分钟前
JAVA基础面试题汇总(持续更新)
java·开发语言
￴ㅤ￴￴ㅤ9527超级帅42 分钟前
LeetCode hot100---二叉树专题(C++语言)
c++·算法·leetcode
sp_wxf1 小时前
Lambda表达式
开发语言·python