【问题标题】:Makefile: rule to put .o in different directory [duplicate]Makefile:将.o放在不同目录中的规则[重复]
【发布时间】:2013-04-03 19:15:54
【问题描述】:

我有这个目录结构:

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

【问题讨论】:

标签: c++ makefile directory-structure


【解决方案1】:

这是因为你没有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)/' .

【讨论】:

  • 另外,$(EXEC): $(OBJ) 中的$(BIN_DIR)/$(OBJ) 应更改为$(OBJ)
  • @Akobold,我明白了:Makefile:6: *** unterminated call to function addsuffix':缺少)'. Stop.
  • @i19:确实,我错过了一些')' - 刚刚修复它:)
  • @Akobold,现在我收到“缺少分隔符”错误 :( 在这一行:@mkdir -p bin
  • @l19: 刚刚编辑了我的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 2012-09-07
相关资源
最近更新 更多