文件搜索路径
方法有两种:一般搜索VPATH,
选择搜索vpath
。
两种方法本质不同:VPATH
是环境变量,是Makefile
中的一种特殊变量,使用时需要指定文件的路径;vpath
是关键字,按照模式搜索,或者说选择搜索,搜索的时候不仅需要加上文件的路径,还需要加上相应限制的条件。
vpath
实例如下,表明在src
路径下搜索.c
文件;在inc
路径下搜索.h
文件。
#vpath %.c src
#vpath %.h inc
VPATH
实例如下,表明在此目录搜索不到的文件可在/inpack
和./inpack/pack_api
路径下搜索文件,对比关键字vpath
,缺少筛选性。
VPATH = ./inpack:./inpack/pack_api
makefile
管理多文件目录方式主要通过将路径传达给程序,下面是一个文件多层嵌套的项目结构:
test_makefile
├─ Makefile
├─ README.md
├─ inpack
│ ├─ message.c
│ ├─ message.h
│ └─ pack_api
│ ├─ print_case.c
│ └─ print_case.h
├─ main.c
└─ outpack
├─ send.c
└─ send.h
该项目makefile
程序如下:
VPATH = ./inpack: \
./inpack/pack_api: \
./outpack \
.PHONY: clean all
# 编译器路径
CC = gcc
# 编译选项 # -I:确保编译器能找到头文件
CFLAGS = -Wall -g -O2 \
-Iinpack \
-Iinpack/pack_api \
-Ioutpack \
# 目标可执行文件
TARGET = hello world
# 源文件
SOURCES = main.c \
message.c \
print_case.c \
send.c \
# 生成对象文件列表
OBJECTS = $(SOURCES:.c=.o)
all: $(TARGET)
@echo "all done"
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@
main.o: main.c message.h send.h
$(CC) $(CFLAGS) -c $< -o $@
message.o: inpack/message.c message.h
$(CC) $(CFLAGS) -c $< -o $@
print_case.o: inpack/pack_api/print_case.c print_case.h
$(CC) $(CFLAGS) -c $< -o $@
send.o: outpack/send.c send.h
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJECTS)
至此,makefile
通过环境变量VPATH
和vpath
管理多文件目录的基础应用结束。目前来说,每增添一个新的文件,就需额外makefile
中增添一条新的程序,对于大型项目多级项目架构和成百上千的文件来说,过于繁琐,下一期尝试以其他方式改进这种方式,类似include
包含其他makefile
文件,具体的主包目前还没学到,等主包学到了第一时间更新该方式。