main: main.o add.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.c add.h
gcc -WALL -g -c add.c -o add.o
sub.o:sub.h sub.c
gcc -WALL -g -c sub.c -o sub.o
make命令即可生成可执行文件。
还有一个伪目标:
clean:
rm -f main main.o add.o sub.o
make clean即可将刚才生成的文件全部删除。
.PHONY:clean用来指定伪目标。
makefile的自动化变量:
$@:规则的目标文件名
$<:规则的第一个依赖文件名
$^:规则的所有依赖文件列表
实际应用:
OBJECT:表示定义一个变量
.PHONY:clean
OBJECTS:main.o add.o sub.o
main:$(OBJECTS)
gcc -WALL -g -c $^ -o $@
main.o:main.c
gcc -WALL -g -c $< -o $@
add.o:add.c
gcc -WALL -g -c $< -o $@
sub.o :sub.c
gcc -WALL -g -c $< -o $@
clean:
rm -f main $(OBJECTS)
有多个可执行文件时:
01test.c 02test.c
makefile文件编码:
.PHONY:clean
BIN:01test 02test
all:$(BIN)
此时执行make可以得到01test 02test两个可执行文件。
做一个更加专业的,我们通常还会定义一些变量:
CC=gcc
CFLAGS:-WALL -g 编译选项
然后上述可以进行替换:
.PHONY:clean
OBJECTS:main.o add.o sub.o
main:$(OBJECTS)
$(CC) $(CFLAGS) -c $^ -o $@
main.o:main.c
$(CC) $(CFLAGS) -c $< -o $@
add.o:add.c
$(CC)$(CFLAGS) -c $< -o $@
sub.o :sub.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f main $(OBJECTS)模式规则:
%.o:%c
后缀模式:
.c.o
如果指示符“include”指定的文件不是以斜线开始(绝对路径,如/usr/src/Makefile...),而且当前目录下也不存在此文件;make将根据文件名试图在以下几个目录下查找:首先,查找使用命令行选项“-I”或者“--include-dir”指定的目录,如果找到指定的文件,则使用这个文件;否则继续依此搜索以下几个目录(如果其存在):“/usr/gnu/include”、“/usr/local/include”和“/usr/include”。
makefile:
make常见的内嵌函数:
函数调用
$(Function Arguments)
$(wildcard PATTERN)
当前目录下匹配模式的文件
例如:src=$(wildcard *.c)
$(patsubst PATTERN,REPLACEMENT,TEXT)
模式替换函数
$(patsubst %.c,%.o,$src)
等价于$(src:.c=.o)
SHELL函数
执行Shelle命令
$(Shell -ls -d */)