make 命令
作用是读入一个名为 Makefile 的文件,然后执行这个文件中指定的指令。
Makefile
Makefile 告诉 make 怎样执行一系列的指令去依靠源文件生成一个目标文件。Makefile 中声明了一个依赖关系的列表,这个列表应当包含所有文件(无论是源文件或者目标)作为输入 。
Makefile 文件一般命名为 Makefile 或 makefile ,如果 m 小写有时候可能会出现错误。
$@ 表示当前目标文件的名字
$^ 表示用空格隔开的所有依赖文件
$< 表示第一个依赖文件
驱动的 Makefile 与一般应用程序的 Makefile 有所不同,驱动的 Makefile 要指定内核源代码的位置。
KDIR := /home/matt/linux-3.2.0-psp04.06.00.11
$(MAKE) -C $(KDIR) M=$(PWD) modules
\$(MAKE) 为自带的变量
-C \$(KDIR) 指明跳转到内核源码目录下读取那里的 Makefile
M=\$(PWD) 表明然后返回到当前目录继续读入、执行当前的 Makefile
方便起见一般都会先定义编译器链接器:
CC = gcc
LD = gcc
正则表达式表示目录下所有 .c 文件,相当于:SRCS = main.c a.c b.c
SRCS = $(wildcard *.c)
OBJS 表示 SRCS 中把列表中的 .c 全部替换为 .o,相当于:OBJS = main.o a.o b.o
OBJS = $(patsubst %c, %o, $(SRCS))
可执行文件的名字:
TARGET = Hello
.PHONE伪目标,具体含义百度一下一大堆介绍
.PHONY:all clean
要生成的目标文件:
all: $(TARGET)
第一行依赖关系:冒号后面为依赖的文件,相当于Hello: main.o a.o b.o
第二行规则:\$@表示目标文件,\$^表示所有依赖文件,\$<表示第一个依赖文件
$(TARGET): $(OBJS)
$(LD) -o $@ $^
上一句目标文件依赖一大堆.o文件,这句表示所有.o都由相应名字的.c文件自动生成
%o:%c
$(CC) -c $^
make clean 删除所有 .o 和目标文件:
clean:
rm -f $(OBJS) $(TARGET)
注意:命令前必须以 tab 键开头,不能是空格
|