详细写一个makefile,实现不同目录下的文件编译
时间: 2024-03-13 07:46:17 浏览: 204
Linux多个Makefile文件编译,多层次Makefile文件编译和多目标Makefile文件编译
5星 · 资源好评率100%
好的,下面是一个实现不同目录下的文件编译的Makefile示例。假设有以下目录结构:
```
project/
├── Makefile
├── src/
│ ├── main.c
│ ├── module1.c
│ └── module1.h
└── obj/
```
我们需要将`src`目录下的源文件编译成`obj`目录下的目标文件,并最终链接成可执行文件`main`。Makefile的内容如下:
```makefile
# 编译器和编译选项
CC = gcc
CFLAGS = -Wall
# 源文件和目标文件所在的目录
SRCDIR = src
OBJDIR = obj
# 源文件列表
SRCS = $(wildcard $(SRCDIR)/*.c)
# 目标文件列表(将源文件的后缀.c替换为.o)
OBJS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
# 可执行文件
TARGET = main
# 默认目标
all: $(TARGET)
# 生成目标文件
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# 生成可执行文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@
# 清除中间文件和可执行文件
clean:
rm -f $(OBJDIR)/*.o $(TARGET)
```
在上述Makefile中,我们首先定义了编译器和编译选项,然后定义了源文件和目标文件所在的目录。使用`wildcard`函数获取`$(SRCDIR)`中的所有`.c`文件,使用`patsubst`函数将`.c`文件替换为`.o`文件,得到目标文件列表`$(OBJS)`。最后定义了默认目标`all`,生成目标文件和可执行文件,以及清除中间文件和可执行文件的目标`clean`。
可以使用以下命令来编译和运行程序:
```
make # 编译程序
./$(TARGET) # 运行程序
make clean # 清除中间文件和可执行文件
```
阅读全文