如何在GNUmake中指定obj和bin目录

时间:2012-10-25 01:48:35

标签: gnu-make

我有以下目录结构,

我也有这个make文件工作正常,但它需要同一目录中的所有文件,并且它还在同一目录中创建* .o和bin文件。有人可以告诉我如何改进这些代码,以便我可以将* .h文件移入/ h,* .c文件到/ src。另外* .o文件将在/ obj中创建,二进制文件将在/ bin中创建?

我在考虑这样的事情。这部分只创建* .o文件,没有二进制文件。但是,这给了我一个错误。

1 个答案:

答案 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