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 に答える