makefile

来源:互联网 发布:seo关键词优化方案案例 编辑:程序博客网 时间:2024/06/07 00:35

Linux开发工具

一、简介

1make工具:利用make工具可以自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译

2makefilemake工具通过一个称为Makefile的文件来完成并自动维护编译工作。Makefile文件描述了整个工程的编译、连接等规则



二、Makefile基本规则

TARGET(target:目标)… :DEPENDENCIES(dependencies:依赖性,相关性)…

COMMAND(command:命令,指挥) …



说明:

1)目标(TARGET):即最终想要产生的文件,如:可执行文件和目标文件等;目标也可以是要执行的动作,如clean,也称为伪目标。

2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。

3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!(但是在CSDN上因为排版的问题,无法正常显示出来。。。)如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容



三、一个简单的Makefile示例

.PHONY:clean #声明伪目标 phony:假的,欺骗的;假冒者

main:main.oadd.o sub.o

gcc-Wall -g main.o add.o sub.o -o main

main.o:main.c

gcc-Wall -g -c main.c -o main.o

add.o:add.cadd.h

gcc-Wall -g -c add.c -o add.o

sub.o:sub.cadd.h

gcc-Wall -g -c sub.c -o sub.o

clean:

rm-f main.o add.o sub.o



执行:

1make #生成第一个目标

2makeclean #“生成”clean伪目标

3makemain.o #仅生成main.o目标

4make-f Makefile #指定执行的文件名



四、Makefile自动化变量

选项名

作用

$@

规则的目标文件名

$<

规则的第一个依赖文件名

$^

规则的所有依赖文列表



示例:【文件名Makefile.01

.PHONY:clean

OBJECTS=main.oadd.o sub.o#定义变量

main:$(OBJECTS)

gcc-Wall -g $^ -o main

main.o:main.c

gcc-Wall -g -c $< -o main.o

add.o:add.cadd.h

gcc-Wall -g -c $< -o add.o

sub.o:sub.cadd.h

gcc-Wall -g -c $< -o sub.o

clean:

rm-f main $(OBJECTS)



执行:make-f Makefile.01

附:如果一条语句在执行Makefile文件时,不想打印出来,则在其前面加上@符号



五、Make编译多个可执行文件

1Make使用隐含推导

示例1

.PHONY:cleanall

BIN=01test02test

all:$(BIN)

clean:

rm-f $(BIN)

示例2

.PHONY:cleanall

BIN=01test02test

all:$(BIN)

01test:01test.o

gcc-Wall -g $< -o $@

02test:02test.o

gcc-Wall -g $< -o $@

clean:

rm-f $(BIN) *.o



2、模式规则

%.o:%.c

3、后缀规则

.c.o:



示例3

.PHONY:cleanall

BIN=01test02test

all:$(BIN)

#%.o:%.c

%.c.o: #与前一条命令作用相同

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

01test:01test.o

gcc-Wall -g $< -o $@

02test:02test.o

gcc-Wall -g $< -o $@

clean:

rm-f $(BIN) *.o



六、综合运用实例

1

.PHONY:cleanall

CC=gcc

CFLAGS=-Wall-g

BIN=01test02test

all:$(BIN)

#%.o:%.c

.c.o:

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

01test:01test.o

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

02test:02test.opub.o

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

clean:

rm-f $(BIN) *.o



2

.PHONY:cleanall

CC=gcc

CFLAGS=-Wall-g

BIN=01test02test 03test

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

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

all:$(BIN)

clean:

rm-f $(BIN) *.o


七、make常用内嵌函数

1、函数调用

$(functionarguments) #$引用的结果就是函数生成的结果



2Makefile下常用的函数

1$(wildcardPATTERN) #匹配当前目录下的文件,wildcard:通配符;pattern模式

例如:src=$(wildcard*.c)

2$(patsubstPATTERN,REPLACEMENT,TEXT) #模式替换函数,replacement 更换,复位

例如:$(patsubst%.c,%.o,$src) #等价于$(src:%.c=%.o)【推荐】

3shell函数

执行shell命令

例如:$(shellls –d */)



八、多级目录Makefile示例

CC = gcc

CFLAGS = -Wall -g

BIN = main

SUBDIR = $(shell ls -d */) #SUBDIR保存了子文件夹

ROOTSRC= $(wildcard *.c) #ROOTSRC保存了当前目录下的.c文件

ROOTOBJ= $(ROOTSRC:%.c=%.o) #ROOTOBJ保存了将ROOTSRC.c替换为.o文件之后的结果

SUBSRC = $(shell find $(SUBDIR) -name '*.c') #SUBSRC保存了所有子目录下的所有.c文件

SUBOBJ = $(SUBSRC:%.c=%.o) #SUBOBJ保存了将SUBSRC.c替换为.o文件之后的结果

$(BIN):$(ROOTOBJ)$(SUBOBJ)

$(CC)$(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)

%.o:%.c

$(CC)$(CFLAGS) -c $< -o $@ #将所有的.c生成.o文件

clean:

rm-f $(BIN) $(ROOTOBJ) $(SUBOBJ)


http://blog.csdn.net/zjf280441589/article/details/19641443

0 0
原创粉丝点击