Makefile编写

Makefile编写

1. make和Makefile的介绍shell

1.1 make工具函数

利用make工具能够自动完成编译工做。这些工做包括:工具

若是仅仅修改了某几个源文件,则只从新编译这几个源文件;若是某个头文件被修改,则从新编译全部包含该头文件的源文件。利用这种自动编译可大大简化开发工做,避免没必要要的从新编译。spa

1.2 Makefile.net

make工具经过一个称为Makefile的文件来完成并自动维护编译工做。Makefile文件描述了整个工程的编译、连接等规则。命令行

2. Makefile基本规则开发

TARGET ...:DEPENDENCIES ...自动化

    COMMANDio

    ...编译

目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也能够是要执行的动做,如clean,也称伪目标。

依赖(DEPENDENCIES)是用来产生目标的输入文件列表,一个目标一般依赖于多个文件。

命令(COMMAND)是make执行的动做(命令是shell命令或者是可在shell下执行的程序)。注意:每一个命令行的起始字符必须为TAB字符。

若是DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容。

接下来就根据这个Makefile基本规则来编写一个最基本的Makefile文件

.PHONY:clean

main:main.o sub.o add.o print.o

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

main.o:main.c

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

add.o:add.c add.h

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

sub.o:sub.c sub.h

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

print.o:print.c print.h

    gcc -Wall -g -c print.c -o print.o

clean:

    rm -f *.o main

咱们能够看到,main是咱们最终想要生成的目标文件,它依赖main.o sub.o add.o print.o这四个.o文件。所以要执行gcc -Wall -g main.o add.o sub.o print.o -o main命令来生成目标文件,可是当前没有这些.o文件,所以就要先生成这些.o文件。咱们写了四条**.o:**.c而后执行gcc -Wall -g -c **.c -o **.o,这些语句就会生成目标文件的依赖项。

clean是一个伪目标文件,由于它没有依赖项。咱们只是想经过make clean来将.o文件删除,可是咱们一般要指定.PHONY:clean这条语句,用来显式的指定clean是伪目标,来防止当前目录下有一个同名的clean文件。这样,一个简单呢的Makefile文件就写好了。

3. Makefile自动化变量

虽然像上述那样能够完成编译,可是明显很是麻烦,接下来介绍Makefile的自动化变量。

选项名 做用

$@ 规则的目标文件名

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

$^ 规则的全部依赖文件列表

咱们使用这些自动化变量来尝试从写刚才的Makefile

.PHONY:clean

OBJ=main.o sub.o add.o print.o

main:$(OBJ)

    gcc -Wall -g $^ -o $@

main.o:main.c

    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 $@

print.o:print.c print.h

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

clean:

    rm -f *.o main

咱们定义了一个变量叫OBJ,他是咱们的依赖项列表。而后使用自动化变量来代替对应的文件,如上所示。

可是,咱们这些.c文件都要生成.o文件,这样写也很是麻烦,咱们介绍另外一些规则。

模式规则 

%.o:%.c

后缀规则 

.c:.o

咱们来使用这两种规则:

.PHONY:clean

 

CC = gcc

CFLAGS = -Wall -g

OBJ = main.o sub.o add.o print.o

main:$(OBJ)

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

#%.o:%.c

.c.o:

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

 

clean:

    rm -f *.o main

使用这两个规则,就会将全部.c文件生成同名的.o文件,这样,Makefile就更加简洁。

4. make经常使用的内嵌函数

函数调用 

$(function arguments)

$(wildcard PATTERN)

当前目录写的匹配模式的文件

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

$(patsubst PATTERN,REPLACEMENT,TEXT)

模式替换函数

例如:$(patsubst %.c, %.o, \$src)

等价于$(src:.c=.o)

shell函数

执行shell命令

例如:$(shell ls -d */)

更多精彩内容敬请期待电鱼电子(www.dianyu.net)

相关文章
相关标签/搜索