我有以下目录结构,
我也有这个可以正常工作的 make 文件,但它需要同一目录中的所有文件,并且它还在同一目录中创建 *.o 和 bin 文件。有人可以告诉我如何改进此代码,以便我可以将 *.h 文件移动到 /h,将 *.c 文件移动到 /src。另外 *.o 文件将在 /obj 中创建,二进制文件将在 /bin 中创建?
我在想这样的事情。这部分只创建 *.o 文件,没有二进制文件。但是,这现在给了我一个错误。
我有以下目录结构,
我也有这个可以正常工作的 make 文件,但它需要同一目录中的所有文件,并且它还在同一目录中创建 *.o 和 bin 文件。有人可以告诉我如何改进此代码,以便我可以将 *.h 文件移动到 /h,将 *.c 文件移动到 /src。另外 *.o 文件将在 /obj 中创建,二进制文件将在 /bin 中创建?
我在想这样的事情。这部分只创建 *.o 文件,没有二进制文件。但是,这现在给了我一个错误。
第1步:h/
添加一个变量,对%.o
规则做一个小的改动,然后添加一个vpath
指令,这样%.o
规则就会知道去哪里看:
INC_DIR = h
%.o: %.c
$(cc) -I$(INC_DIR) -c $<
vpath %.h $(INC_DIR)
第2步:src/
添加另一个变量,更改 的分配objs
,添加另一个vpath
:
SRC_DIR := src
objs:=$(patsubst $(SRC_DIR)/%.c,%.o,$(wildcard $(SRC_DIR)/*.c))
vpath %.c $(SRC_DIR)
第 3 步:obj/
添加一个变量,再次更改objs
和规则,规则:%.o
clean
OBJ_DIR = obj
objs:=$(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(wildcard $(SRC_DIR)/*.c))
$(OBJ_DIR)/%.o: %.c
$(cc) -Ih -c $< -o $@
clean:
rm -f *.d $(OBJ_DIR)/*.o $(prog)
第4步:bin/
添加另一个变量,并更改 的赋值prog
:
BIN_DIR := bin
prog:=$(BIN_DIR)/$(notdir $(PWD))
编辑:
你现在要求的是一个糟糕的设计。但这里是:
对象/生成文件:
SRC_DIR := ../src
objs:=$(patsubst $(SRC_DIR)/%.c,%.o,$(wildcard $(SRC_DIR)/*.c))
cc:=gcc
.PHONY: ALL_OBJS
ALL_OBJS: $(objs)
INC_DIR := ../h
%.o: %.c
$(cc) -I$(INC_DIR) -c $<
vpath %.c $(SRC_DIR)
.PHONY: clean test
clean:
rm -f *.[od]
-include *.d
箱/制作文件:
P:= $(PWD)
P:= $(dir $(P))
prog:= $(notdir $(P:/=))
OBJ_DIR := ../obj
objs:=$(notdir $(wildcard $(OBJ_DIR)/*.o))
cc:=gcc
ccflags:=-lcurses -lgdbm -lgdbm_compat
$(prog): $(objs)
$(cc) $(ccflags) -o $@ $^
vpath %.o $(OBJ_DIR)
.PHONY: clean test
clean:
rm -f *.d $(prog)
test: $(prog)
$(test)
-include *.d