makefile文件编写

  • 格式:doc
  • 大小:50.00 KB
  • 文档页数:6

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Makefile文件编写详解

——WangYiwei 利用makefile工具可以自动完成编译工作。如果仅修改了几个源文件,

则只重新编译这几个源文件,其他没有修改的不再去编译。如果某个头文件被修改,则只重新编译包含这几个头文件的源文件。因此可以简化开发工作。

格式:

TARGET(目标) :DEPENDENCIES(依赖)

COMMOND(命令)

目标:程序要产生的文件,如可执行文件和目标文件。目标也可以是要执行的动作,如clean也成为伪目标。

依赖:是用来产生目标输入文件列表,一个目标通常依赖于多个文件。

命令:是make执行的动作(命令是shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符都是table字符

$@ 规则目标文件名

$< 规则第一个依赖文件名

$^ 规则的所有文件列表

例子:

(1)生成一个可执行文件:

说明:在01目录下有main.c sub.c sub.h add.c add.h Makefile,以下部分是Makefile的内容

①简单的例子

.PHONY: clean

#显示地指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作main: main.o add.o sub.o

gcc main.o add.o sub.o -o main

main.o: main.c add.h sub.h

gcc -c main.c -o main.o

add.o: add.c add.h

gcc -c add.c -o add.o

sub.o: sub.c sub.h

gcc -c sub.c -o sub.o

clean:

@echo "remove file ..."

rm main main.o add.o sub.o

②利用自定义变量和自动化变量

.PHONY: clean

#显示的指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作OBJECTS = main.o add.o sub.o

#自定义变量

main: $(OBJECTS)

gcc -Wall -g $^ -o $@

main.o: main.c add.h sub.h

gcc -Wall -g -c $< -o $@

add.o: add.c add.h

gcc -Wall -g -c $< -o $@

sub.o: sub.c sub.h

gcc -Wall -g -c $< -o $@

clean:

@echo "remove file ..."

#在命令前加@表示不显示命令

rm -f main $(OBJECTS)

(2)生成多个可执行文件

说明:在02目录下有01test.c 02test.c 03test.c Makefile,以下部分是Makefile 的内容

①默认规则

.PHONY: all clean

#显示的指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作CC = gcc

CFLAGS = -Wall -g

BIN = 01test 02test 03test

all: $(BIN)

clean:

@echo "Begin remove ..."

rm -f $(BIN)

执行之后生成01test 02test 03test可执行文件,系统执行的是隐含推导规则,也可以自己编写推导规则。

②编写模式规则,%o:%c

说明:%o(目标):%c(依赖),系统将先将.c源文件生成.o的目标文件,再将.o 源文件生成可执行文件

.PHONY: all clean

BIN = 01test 02test 03test #自定义变量

all: $(BIN)

%.o:%.c

gcc -Wall -g -c $< -o $@

01test: 01test.o

gcc -Wall -g $^ -o $@

02test: 02test.o

gcc -Wall -g $^ -o $@

03test: 03test.o

gcc -Wall -g $^ -o $@

clean:

@echo "Begin remove ..."

rm -f *.o $(BIN)

③编写后缀规则.c.o:

说明:系统每次要执行.o目标文件生成可执行文件的过程前,通知后缀规则生成.o可执行文件。

.PHONY: all clean

CC = gcc

CFLAGS = -Wall -g

BIN = 01test 02test 03test

all: $(BIN)

.o.c:

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

01test: 01test.o

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

02test: 02test.o

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

03test: 03test.o

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

clean:

@echo "Begin remove ..."

rm *.o $(BIN)

(3)多级目录一个makefile的实现

说明:在03目录下有test/目录main.c Makefile,在test/目录下有aa/目录test.c test.h,在aa/目录下有bb/目录aal.c aal.h,在bb/目录下有cc/目录dd/