我有以下目录结构,
我也有这个make文件工作正常,但它需要同一目录中的所有文件,并且它还在同一目录中创建* .o和bin文件。有人可以告诉我如何改进这些代码,以便我可以将* .h文件移入/ h,* .c文件到/ src。另外* .o文件将在/ obj中创建,二进制文件将在/ bin中创建?
我在考虑这样的事情。这部分只创建* .o文件,没有二进制文件。但是,这给了我一个错误。
答案 0 :(得分:2)
第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))
修改:
你现在要求的是一个糟糕的设计。但这里是:
OBJ /生成文件:
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