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。○

所以 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 回答