makefile菜鸟教程
时间: 2023-09-04 15:15:52 浏览: 493
Makefile 是一种用来自动化编译程序的工具,使用它可以简化编译过程,提高编译效率。下面是一个简单的 Makefile 菜鸟教程。
假设我们的工程目录结构如下:
```
project
├── src
│ ├── main.c
│ ├── func1.c
│ └── func2.c
├── include
│ ├── func1.h
│ └── func2.h
└── bin
```
其中,src 目录包含了源代码,include 目录包含了头文件,bin 目录用于存放编译后的可执行文件。
我们的目标是编译出一个名为 project 的可执行文件。下面是一个简单的 Makefile:
```makefile
CC = gcc
CFLAGS = -Wall -I./include
LDFLAGS = -lm
SRCS := $(wildcard src/*.c)
OBJS := $(patsubst %.c, %.o, $(SRCS))
TARGET = bin/project
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(OBJS) $(TARGET)
```
接下来逐行解释每个部分的作用:
- `CC` 定义编译器的路径和名称。
- `CFLAGS` 定义编译器的编译选项。这里使用了 `-Wall` 表示开启所有警告信息,`-I./include` 表示头文件的路径为 `./include`。
- `LDFLAGS` 定义链接器的链接选项。这里使用了 `-lm` 表示链接 `libm` 库。
- `SRCS` 使用 `wildcard` 函数获取 `src` 目录下的所有 `.c` 文件。
- `OBJS` 使用 `patsubst` 函数将 `.c` 文件名替换成 `.o` 文件名。
- `TARGET` 定义目标可执行文件的路径和名称。
- `all` 是一个伪目标,表示默认编译所有目标。
- `$(TARGET)` 是一个依赖目标,表示编译目标可执行文件。它依赖于所有的 `.o` 文件。
- `$(OBJS)` 是一个中间变量,表示所有的 `.o` 文件。
- `$@` 表示目标文件名,`$^` 表示所有依赖文件名。
- `%.o: %.c` 是一个模式规则,表示将所有 `.c` 文件编译成 `.o` 文件。
- `clean` 是一个伪目标,表示清除所有中间文件和目标文件。
使用方法:
1. 将上述代码保存为 `Makefile` 文件。
2. 在终端中进入工程目录。
3. 执行命令 `make`,即可自动编译出目标可执行文件。
4. 执行命令 `make clean`,即可清除所有中间文件和目标文件。
以上就是一个简单的 Makefile 菜鸟教程,希望能对你有所帮助。
阅读全文