0

どこかでうまくいかない!!

../bin/にオブジェクトファイルを生成しようとしています

ただし、以下のコードは、対応するソースファイルディレクトリに生成されます。

私が実行しているコードの下。

変更されたコード:

LIB = $(BIN_DIR)/libutils.a
APP = $(BIN_DIR)/app

CC = gcc
AR = ar

CFLAGS = -Wall -g
LDFLAGS =


all: $(LIB) $(APP)

SRC =   $(SRC_DIR)/add.c \
        $(SRC_DIR)/sub.c 

OBJ = $(SRC:.c=.o)


INCLUDES = -I$(INC_DIR)/
LIBS = -L../ -L/usr/local/lib -lm

LDFLAGS = -g
.SUFFIXES: .c

.c.o:
    $(CC) $(INCLUDES) -c $(SRC_DIR)/$< -o $(BIN_DIR)/$@

$(LIB): $(OBJ)
$(AR) rcs $(LIB) $(OBJ)

$(BIN_DIR)/app: $(BIN_DIR)/test.o \
                $(BIN_DIR)/t.o \
                $(BIN_DIR)/libutils.a
    $(CC) $(LDFLAGS) -o $@ $^
    
clean:
    rm -f $(LIB) $(BIN_DIR)/* $(SRC_DIR)/*.o *.o

ありがとうございました :)

4

2 に答える 2

2

あなたはまだルールを持っています:

$(LIB): $(OBJ)
    ...

そしてOBJまだですので、オブジェクトルールが意図したとおりに機能する場合、src_dir/add.o src_dir/sub.o Makeはこれらのオブジェクトを構築しようとします。したがって、最初のステップ:

SRC = $(SRC_DIR)/add.c \ $(SRC_DIR)/ sub.c

OBJ = $(SRC:.c = .o)
OBJ = $(patsubst $(SRC_DIR)/%.c,$(BIN_DIR)/%.o,$(SRC))

これで、オブジェクトルールが見つかります。

.c.o:
    ...

オブジェクトファイルが置かれるべき場所と同じ場所にソースファイルが見つかることを期待しているため、機能しません(つまり$(OBJ_DIR))。したがって、このルールを次のように置き換えます。

$(BIN_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(INCLUDES) -c $< -o $@

$(BIN_DIR)/t.oとを構築するためのプロビジョニングがないことに気付きました$(BIN_DIR)/test.oが、アプリにはそれらが必要です。あなたはそれを調べる必要があります。

さらなる改良が可能ですが、これは始まりです。

于 2013-03-27T12:41:11.083 に答える
0

SRCには相対パスがあり、OBJは拡張子がに変更されたSRCにすぎません。o

したがって、OBJにはこれが含まれます。

../src/add.o
../src/sub.o

そして、.oが作成される場所があります。

これらの変更を行うと、機能します。

SRC =   add.c \
        sub.c

.c.o:
    $(CC) $(INCLUDES) -c ../src/$< -o ../bin/$@
于 2013-03-27T05:10:02.777 に答える