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

标签: Linux 应用 Makefile 多目标
16人阅读 评论(0) 收藏 举报
分类:
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)
编译完成后文件夹内容为:

3. 作者介绍
本人是一名Linux应用开发工程师,目前供职于一家世界500强公司,主要负责车联网产品的研发。喜交天下好友,欢迎添加本人微信一起学习、交流!





查看评论

makefile编译多个目标

www.360doc.com/content/11/1108/21/1317564_162898533.shtml 1.makefile编译多个目标。 我们知道makefile通常把第一个目标...
  • wangjingyu00711
  • wangjingyu00711
  • 2014-12-18 09:01:12
  • 698

多个C文件生成多个目标的makefile

SOURCES=$(wildcard *.c) PROGS=$(patsubst %.c, %, $(SOURCES)) all:$(PROGS) $(PROGS):%:%.c gcc $^...
  • lanseshenhua
  • lanseshenhua
  • 2010-12-21 16:20:00
  • 2894

makefile在同一目录下编译出多个可执行文件

测试可用的makefile,在同一目录下编译多个可执行文件
  • lidonghat
  • lidonghat
  • 2017-03-17 16:44:16
  • 1082

makefile 之多目录,多目标编译

makefile 经常会遇到需要一个编译不同的子模块,由子模块再编译出
  • Pray90
  • Pray90
  • 2014-10-01 20:15:46
  • 2404

Makefile生成多个目标文件

CC     = clang CFLAGS = -pipe -g -Wall -W OBJDIR = .tmp MKDIR  = mkdir -p SOURCES = $(wildcard *.c...
  • pbe_sedm
  • pbe_sedm
  • 2014-05-13 20:23:23
  • 1003

[ make ] Makefile: 多个all目标的处理 和 变量目标的处理

jielong.lin@xmbuilder03:~$ vim  makefile TEST_VAR=1 $(TEST_VAR): echo $@ TEST_VAR=2 $(TEST_...
  • x13015851932
  • x13015851932
  • 2017-02-25 17:37:37
  • 1090

Linux学习笔记——例说makefile 多个文件

0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借...
  • xukai871105
  • xukai871105
  • 2014-07-02 21:26:56
  • 9041

makefile 多目标和多规则

makefile 多目标 一个规则中可以有多个目标,规则所定义的命令对所有目标有效。 多目标意味着所有的目标具有相同的依赖文件,多目标通常用在一下两种情况: 仅需要一个描述依赖关系的规则,不需要...
  • iosxiaoming
  • iosxiaoming
  • 2015-08-08 21:23:36
  • 2314

Makefile---相同目标如何处理

Makefile---相同目标如何处理 如果Makefile中有多个相同的目标,它是怎么执行的? target1: dep1 target1: dep2        ...
  • dl0914791011
  • dl0914791011
  • 2013-12-31 11:04:49
  • 2183
    个人资料
    等级:
    访问量: 1116
    积分: 158
    排名: 90万+
    文章存档