玩转Makefile | 一次编译多个目标

简介: 玩转Makefile | 一次编译多个目标


1. 使用场景


本教程所介绍的Makefile不太适用于企业级项目,适用于我们平时练习时编写小代码而快速编译的场景。具体来讲,是这样的场景:


我们平时看书或教程时,里面讲到的一些案例我们想实操一下,这类的案例一般比较短小,经常一个.c文件就足矣。如果针对每个小程序都编写一个Makefile那就显得有些麻烦,或者不编写Makefile,那就要手动敲一串gcc编译命令,会影响学习效率。


于是我们就有这种需求:在一个文件夹下面有多个.c文件,分别对应一个小程序,而总共只有一个Makefile,只要一个make命令就可以把这些程序全部编译一遍。并且,再往里面增加小程序时,make一下也可以编译这个新增的程序。


本篇教程就是为了实现这个需求而编写的Makefile。


2. 编写思路


1. 我们将文件夹下每个.c文件都视为一个程序,编译出来程序的名字(目标)与.c文件的文件名相同(去掉.c后缀),比如app1.c编译出来的程序为app1。实现这个目的的Makefile片断为:


SOURCE = $(wildcard *.c)  

TARGETS = $(patsubst %.c, %, $(SOURCE))  

2. 每个.c文件独立编译为一个目标,如果直接手写的话,对应的命令类似为:


gcc app1.c -o app1  

   gcc app2.c -o app2  

   gcc test.c -o test  


这样的命令可以抽象为一个,即:


$(TARGETS):%:%.c  

   $(CC) $< $(CFLAGS) -o $@  


TARGETS即为app1, app2, test,依赖为%:%c,这是一个模式变量,表示与目标相同的.c文件,即:


app1:app1.c  

   app2:app2.c  

   test:test.c  


有了这两个思路后,Makefile就可以补充完整了。完整的代码可以在公众号内回复mk2获取。


文件夹内容如下:


image.png


完整Makefile为:


SOURCE = $(wildcard *.c)  
TARGETS = $(patsubst %.c, %, $(SOURCE))  
CC = gcc  
CFLAGS = -Wall -g  
all:$(TARGETS)  
$(TARGETS):%:%.c  
    $(CC) $< $(CFLAGS) -o $@  
.PHONY:clean all  
clean:  
    -rm -rf $(TARGETS)

 

编译完成后文件夹内容为:


image.png

目录
相关文章
|
7月前
|
C语言 Windows
使用CMake调用Makefile 项目
使用CMake调用Makefile 项目
118 0
|
7月前
|
开发框架 Unix Linux
深度探索:Qt CMake工程编译后的自动打包策略
深度探索:Qt CMake工程编译后的自动打包策略
409 0
|
7月前
|
Shell Linux C++
Makefile编译实战
Makefile编译实战
95 0
|
C语言
Makefile教程(Makefile的结构)
Makefile教程(Makefile的结构)
111 0
|
7月前
|
Linux C语言
make:***没有指明目标并且找不到makefile。停止。
make:***没有指明目标并且找不到makefile。停止。
904 0
|
2月前
|
存储 编译器 Linux
1.7.1 目标代码文件、可执行文件和库
C编程将源代码文件转换为可执行文件,此过程分为编译与链接两步。首先,编译器将源代码转化为中间代码,再由链接器将其余代码融合,最终生成可执行文件。此方法有助于程序模块化,允许独立编译各模块并在后期使用链接器整合,避免因单一模块变动导致整体重编。同时,链接器还会将用户程序与预编译库代码结合,生成完整程序。目标代码文件在链接前缺少启动代码及库函数,这些由链接器在最后阶段补充完整。
69 7
|
7月前
|
算法 IDE Linux
【CMake 小知识】CMake中的库目标命名和查找策略解析
【CMake 小知识】CMake中的库目标命名和查找策略解析
300 1
|
7月前
|
编译器 C语言 C++
CMake基础(7)编译标志
CMake基础(7)编译标志
267 0
|
编译器 C语言 C++
Makefile中常见的gcc编译参数
Makefile中常见的gcc编译参数
417 0