我有这个目录结构:
.\src
包含所有源代码(.h
和.cpp
).\bin
应该包含所有.o
和.bin
.
有Makefile
这是我目前的Makefile:
CFLAGS = -Wall -pedantic -g
CC = g++
EXEC = flrfile
SRC_DIR = src
BIN_DIR = bin
SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ := $(patsubst $(SRC_DIR)/%,%,$(SOURCES))
OBJ := $(patsubst %.cpp,%.o,$(OBJ))
OBJ := $(addprefix ../$(BIN_DIR)/,$(OBJ))
all: flrfile
../$(BIN_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
$(CC) $(CFLAGS) -c $(SRC_DIR)/%.cpp -o $@
$(EXEC): $(OBJ)
@mkdir -p $(BIN_DIR)
$(CC) $(CFLAGS) $(BIN_DIR)/$(OBJ) -o $(BIN_DIR)/$(EXEC)
.PHONY : clean
clean:
-rm -rf $(BIN_DIR)
当我运行make
时,我收到此错误:
g++ -Wall -pedantic -g -c src/%.cpp -o ../bin/FixedLengthFieldsRecord.o
g++: error: src/%.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [../bin/FixedLengthFieldsRecord.o] Error 4
这是为什么?说实话,我对Makefile几乎没有理解......
答案 0 :(得分:2)
编译的正确行应如下所示:
$(BIN_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
$(CXX) -o $@ -c $< $(CFLAGS)
这意味着:“对于与$(BIN_DIR)中的模式”%.o“匹配的每个文件,使用关联的$(SRC_DIR)/%。cpp作为参数(第一个依赖项)编译它
补充说明:我怀疑有些缺少依赖项:通常,.c或cpp源文件仅依赖于相应的头文件,但也可能包含项目中的其他标头。 / p>