绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
玩转Makefile | 一次编译多个目标
2019-02-18 14:21:15
我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货,欢迎关注「良许Linux」,欢迎点赞、收藏!

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))
  1. 每个.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获取。

文件夹内容如下:


完整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)

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



码字不易,欢迎点赞、收藏,让我更有动力生产更多 Linux 干货,多谢!

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Linux技术精选专区
创建时间:2020-07-08 10:30:23
Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • dapan
    专家
戳我,来吐槽~