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

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

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

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

在这里插入图片描述

c语言内容💖:

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

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


目录

  • Makefile 介绍:
    • 源代码的编译过程
  • Makefile 的基本语法:
  • 示例

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 文件示例:

# 定义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)
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

image.png


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
http://www.lryc.cn/news/354058.html

相关文章:

  • PHP生成二维码+二维码包含logo图片展示
  • vue项目打包教程
  • 制作电子画册速成攻略,快来试试
  • 【java程序设计期末复习】chapter7 内部类和异常类
  • Windows下安装配置深度学习环境
  • 如何使用ssh将vscode 连接到服务器上,手把手指导
  • Tomcat调优参数
  • 云计算和大数据处理
  • VAE-变分自编码器(Variational Autoencoder,VAE)
  • Android Room 使用模版
  • Linux/Ubuntu 中安装 ZeroTier,实现内网穿透,2分钟搞定
  • java技术:oauth2协议
  • Java 18 新特性详解
  • 【css3】06-css3新特性之网页布局篇
  • 【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL
  • 跨境选品师不是神话:普通人也能轻松掌握,开启全球贸易新篇章!
  • 前缀和,差分算法理解
  • ubuntu/部分docker容器无法访问https站点
  • 【MySQL】库的基础操作
  • 嵌入式0基础开始学习 ⅠC语言(2)运算符与表达式
  • 汇编语言(一)
  • 2010-2022年各省新质生产力数据(含原始数据+测算代码+计算结果)
  • 需求分析部分图形工具
  • ML307R OpenCPU GPIO使用
  • python基于深度学习的聊天机器人设计
  • Golang设计模式(四):观察者模式
  • huggingface 笔记:查看GPU占用情况
  • JavaSE 学习记录
  • HTML与CSS的学习
  • 【单片机】STM32F070F6P6 开发指南(一)STM32建立HAL工程