我有这个目录结构:
./src
包含我需要的所有文件的。cpp
和.h
./bin
应暂时包含.o
,永久包含.bin
。此外,调用make clean
时,应删除此文件夹。./
包含Makefile
这是我目前的Makefile
:
CFLAGS = -Wall -pedantic -g
CC = g++
EXEC = flrfile
SRC_DIR = src
BIN_DIR = bin
OBJ = FixedLengthFieldsRecord.o FixedLengthRecordFile.o main.o
all: flrfile
../$(BIN_DIR)/%.o: $(SRC_DIR)%.cpp $(SRC_DIR)%.h
$(CC) $(CFLAGS) -c $(SRC_DIR)%.cpp -o $@
$(EXEC): $(OBJ)
@mkdir -p bin
$(CC) $(CFLAGS) $(BIN_DIR)/$(OBJ) -o $(BIN_DIR)/$(EXEC)
.PHONY : clean
clean:
-rm -rf $(BIN_DIR)
当我运行make
时,我收到此错误:
make: *** No rule to make target `FixedLengthFieldsRecord.o', needed by `flrfile'. Stop.
为什么会这样?
PS:另外,我怎样才能使OBJ = FixedLengthFieldsRecord.o FixedLengthRecordFile.o main.o
更通用?我不想写所有.o
...
答案 0 :(得分:3)
这是因为您没有something.o
的规则,因此您有../bin/something.o
的规则。
如果您将OBJ
声明更改为
OBJ = ../$(BIN_DIR)/FixedLengthFieldsRecord.o ../$(BIN_DIR)/FixedLengthRecordFile.o ../$(BIN_DIR)/main.o
它应该有用。
您可以使用通配符从源目录获取对象
SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ := $(patsubst $(SRC_DIR)/%,%,$(SOURCES))
OBJ := $(patsubst %.cpp,%.o,$(OBJ))
OBJ := $(addprefix ../$(BIN_DIR)/,$(OBJ))
这样做首先从$(SRC_DIR)
获取cpp文件列表,删除路径,然后替换o的所有cpp后缀,最后在前面添加`../$(BIN_DIR)/'每个项目。