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)