4

我有这个目录结构:

  • ./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...

4

1 回答 1

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))

这样做是首先它从 中获取 cpp 文件列表$(SRC_DIR),删除路径,然后替换 o 的所有 cpp 后缀,最后在每个项目前添加 `../$(BIN_DIR)/'。

于 2013-04-03T19:20:52.727 回答