阡陌 发表于 2024-2-22 22:34:28

Makefile


**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 键开头,不能是空格

页: [1]
查看完整版本: Makefile