利用Makefile函数,两个不同src文件夹中的源文件和inc文件夹下的头文件生成obj文件夹.o文件,最后通过Makefile将所有文件打包编译
时间: 2024-03-10 08:46:47 浏览: 19
好的,这是一个比较常见的Makefile编写问题。下面是一个简单的Makefile示例,可以满足您的需求:
```
# 定义变量
CC = gcc
CFLAGS = -Wall -I./inc
SRC_DIR1 = src1
SRC_DIR2 = src2
OBJ_DIR = obj
BIN = myprogram
# 获取源文件列表
SRCS1 := $(wildcard $(SRC_DIR1)/*.c)
SRCS2 := $(wildcard $(SRC_DIR2)/*.c)
# 将源文件列表转换为目标文件列表
OBJS1 := $(patsubst $(SRC_DIR1)/%.c,$(OBJ_DIR)/%.o,$(SRCS1))
OBJS2 := $(patsubst $(SRC_DIR2)/%.c,$(OBJ_DIR)/%.o,$(SRCS2))
# 定义规则
all: $(BIN)
$(BIN): $(OBJS1) $(OBJS2)
$(CC) $^ -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR1)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR2)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJ_DIR):
mkdir $(OBJ_DIR)
clean:
rm -rf $(OBJ_DIR) $(BIN)
```
这个Makefile文件中,我们定义了以下变量:
- `CC`:编译器
- `CFLAGS`:编译选项,包括启用所有警告和指定头文件目录
- `SRC_DIR1`、`SRC_DIR2`:两个源文件目录
- `OBJ_DIR`:目标文件目录
- `BIN`:可执行文件名
接下来,我们使用`wildcard`函数获取源文件列表,再使用`patsubst`函数将源文件列表转换为目标文件列表。
然后,我们定义了以下规则:
- `all`:默认规则,编译可执行文件
- `$(BIN)`:依赖于所有的目标文件,链接成可执行文件
- `$(OBJ_DIR)/%.o`:将每个源文件编译成目标文件
- `$(OBJ_DIR)`:创建目标文件目录
- `clean`:删除所有生成的文件
最后,我们可以在命令行中使用`make`命令来编译程序。