1

我有以下目录结构,

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

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

4

1 回答 1

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和规则,规则:%.oclean

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
于 2012-10-25T12:20:25.313 回答