玩转Makefile | 一次编译多个目标 - Go语言中文社区

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


0. 相关阅读

    玩转Makefile | 系列综述

    玩转Makefile | 基础入门

    玩转Makefile | 四步教你从零开始写Makefile

    玩转Makefile | 企业项目Makefile实例

    玩转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就可以补充完整了。完整的代码可以从这里获取。

 

文件夹内容如下:

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

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

 

 

---------------

码字不易,点个赞再走呗~

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群;提供永久免费 CSDN 资料下载服务。

 

 

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yychuyu/article/details/79950414
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 19:34:05
  • 阅读 ( 1385 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢