Makefile,可以生成特定路径中的所有目标文件

时间:2013-03-27 05:06:18

标签: makefile gnu-make

某处我错了!!

我正在尝试在 ../ 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

谢谢:)

2 个答案:

答案 0 :(得分: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的规定,但应用程序需要它们。你应该研究一下。

可以进一步改进,但这是一个开始。

答案 1 :(得分: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/$@