Makefile循环依赖性错误

时间:2015-10-17 03:45:32

标签: c++ makefile

我有一个makefile,可以编译src文件夹中的所有cpp文件。所有cpp文件都依赖于他们的.h文件。所以我有一条规则要做所有这些(我想)。

但是我想从源文件列表中删除main.cpp,因为它没有相应的头文件。

我有代码从cpp文件列表中删除main。然后我写了一个单独的规则来编译main。我认为这是我出错的地方。

这是makefile和错误。

CC := g++
CFLAGS := -g -O2
BIN_DIR := bin
BUILD_DIR := build
SRC_DIR := src
TARGET := wavfiletool.exe
MAIN := WavFileTool 

SOURCES := $(wildcard src/*.cpp)
SOURCES := $(filter-out src/$(MAIN).cpp, $(SOURCES))
OBJECTS := $(SOURCES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.o)

$(BIN_DIR)/$(TARGET): $(MAIN).o $(OBJECTS) 
    $(CC) $(OBJECTS) $(CFLAGS)  -o $@ 

$(MAIN).o: $(MAIN).cpp
    $(CC) $(CFLAGS) -c $(MAIN).cpp -o $(MAIN).o

$(OBJECTS): $(BUILD_DIR)/%.o : $(SRC_DIR)/%.cpp : $(SRC_DIR)/%.h
    @$(CC) $(CFLAGS) -c $< -o $@

ERROR:

make: Circular WavFileTool <- WavFileTool dependency dropped.

编辑:当我从目标行中删除$(MAIN).o依赖项时,错误就会消失。

1 个答案:

答案 0 :(得分:3)

循环依赖性是由WavFileTool之后的虚假空间引起的,这导致$(BIN_DIR)/$(TARGET)的目标看起来像这样

bin/WavFileTool.exe: WavFileTool .o (other .o files)

在下一条规则中WavFileTool由于同样的问题而最终依赖于自身:

WavFileTool .o: WavFileTool .cpp

除去空间是不够的,因为你最后有一个无效的静态规则(你不能“链接”这样的目标),并且因为你没有正确指定{{1的路径}}

使用更标准的解决方案来生成自己的依赖项,而不是修复你的makefile:

$(MAIN).o

BIN_DIR := bin BUILD_DIR := build SRC_DIR := src TARGET := WavFileTool.exe CC := g++ CPPFLAGS := -MMD -MP CXXFLAGS := -g -O2 SOURCES := $(wildcard $(SRC_DIR)/*.cpp) OBJECTS := $(SOURCES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.o) DEPS := $(wildcard $(BUILD_DIR)/*.d) RM = -del $(subst /,\,$1) .PHONY: clean $(BIN_DIR)/$(TARGET): $(OBJECTS) $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ $(OBJECTS): $(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(OUTPUT_OPTION) $< clean: ; $(call RM, $(DEPS) $(OBJECTS)) include $(DEPS) $(MAKEFILE_LIST): ; %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% 之后的最后一部分禁用重新制作makefile和其他一些隐式规则,这在使用include调试make文件时非常有用,否则你必须涉及大量不必要的输出。