首页 文章

Makefile循环依赖错误

提问于
浏览
0

我有一个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 $@

错误:

make: Circular WavFileTool <- WavFileTool dependency dropped.

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

1 回答

  • 3

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

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

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

    WavFileTool .o: WavFileTool .cpp
    

    摆脱空间不是这样的目标,因为你没有正确指定 $(MAIN).o 的路径 .

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

    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.%
    

    include 之后的最后一部分禁用重新制作makefile和一些其他隐式规则,这在使用 -d 调试make文件时非常有用,否则你必须涉及大量不必要的输出 .

相关问题