某处我错了!!
我正在尝试在 ../ 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
谢谢:)
答案 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/$@