轻松玩转Makefile | 基础用法
2023/3/2 21:21:00
本文主要是介绍轻松玩转Makefile | 基础用法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
本文通过几个简单的示例,可以快速了解Makefile的基本使用方法,适用于编译我们平时练习所编写的小量代码。
1. make命令
Makefile文件内容: all为目标,这里没有依赖的文件,这条命令是打印(echo)出“Hello Makefile”这行文字
all: echo "Hello Makefile"
运行make后,终端打印的内容
$ make echo "Hello Makefile" Hello Makefile
可以看到,Makefile的命令也打印在了终端,要想不输出命令的内容,可以在命令前面加上@
make可以指定要生成的目标,如果不指定,则默认第一个目标,我们将Makefile文件内容修改一下
all: @echo "Hello Makefile" test: @echo "Hello Test"
运行不同的命令,可以看到不同的打印信息
$ make Hello Makefile $ make all Hello Makefile $ make test Hello Test
2. 生成文件
假设现在有两个文件fun.c和main.c,需要利用Makefile生成一个可执行文件app。
fun.c的内容
#include <stdio.h> void fun() { printf("This is fun()!\n"); }
main.c的内容
extern void fun(); int main() { fun(); return 0; }
Makefile的内容
all: main.o fun.o gcc -o app main.o fun.o main.o : main.c gcc -o main.o -c main.c fun.o : fun.c gcc -o fun.o -c fun.c clean: rm app main.o fun.o
当执行make命令后,终端会打印下列内容,并生成对应的app , main.o ,fun.o文件
gcc -o main.o -c main.c gcc -o fun.o -c fun.c gcc -o app main.o fun.o
3. 清除文件
依旧是上面的Makefile和源文件,我们输入make clean,就可以清除刚刚生成的3个文件。打印信息如下:
$ make clean rm app main.o fun.o
假如Makfile目录中,有名为clean文件,make之后再执行make clean又会发生什么呢?
我们输入touch clean产生一个空的文件,再执行make clean,观察现象
$ touch clean $ make clean $ make: 'clean' is up to date.
此时make提醒clean文件是最新的,而不是执行清除操作。
要解决这个问题,我们就得引入伪目标。
伪目标
伪目标采用".PHONY" 关键字来定义, 且必须是大写字母。修改一下上面的Makefile
.PHONY:clean all: main.o fun.o gcc -o app main.o fun.o main.o : main.c gcc -o main.o -c main.c fun.o : fun.c gcc -o fun.o -c fun.c clean: rm app main.o fun.o
输入make clean,我们会发现此时能够正常执行清除操作。
makefile内容的注释
在Makefile文件中,有些内容我们需要写一下备注,或者暂时不需要了,想注释掉,需要怎么操作呢。很简单,只需要在需要注释的那行前面加上#号即可,像下面这样
#这是的Makefile的注释 #all: main.o fun.o .PHONY:clean all: main.o fun.o gcc -o app main.o fun.o main.o : main.c gcc -o main.o -c main.c fun.o : fun.c gcc -o fun.o -c fun.c clean: rm app main.o fun.o
本文所介绍的Makefile,应付几个文件的编译还可以,在实际的工程中,会有几十个、上百个文件。要是都一个个这样按文件名书写,效率太低,且不好维护。后面的文章,我将会介绍Makefile的变量和函数,利用它们,我们的Makefile可以大大提升效率,且便于维护。
这篇关于轻松玩转Makefile | 基础用法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-22程序员出海做 AI 工具:如何用 similarweb 找到最佳流量渠道?
- 2024-12-20自建AI入门:生成模型介绍——GAN和VAE浅析
- 2024-12-20游戏引擎的进化史——从手工编码到超真实画面和人工智能
- 2024-12-20利用大型语言模型构建文本中的知识图谱:从文本到结构化数据的转换指南
- 2024-12-20揭秘百年人工智能:从深度学习到可解释AI
- 2024-12-20复杂RAG(检索增强生成)的入门介绍
- 2024-12-20基于大型语言模型的积木堆叠任务研究
- 2024-12-20从原型到生产:提升大型语言模型准确性的实战经验
- 2024-12-20啥是大模型1
- 2024-12-20英特尔的 Lunar Lake 计划:一场未竟的承诺