我有一个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 回答
循环依赖是由
WavFileTool
之后的虚假空间引起的,这导致$(BIN_DIR)/$(TARGET)
的目标看起来像这样在下一个规则中
WavFileTool
由于同样的问题而最终依赖于自身:摆脱空间不是这样的目标,因为你没有正确指定
$(MAIN).o
的路径 .而不是修复您的makefile,使用更标准的解决方案来生成自己的依赖项可能更有用:
include
之后的最后一部分禁用重新制作makefile和一些其他隐式规则,这在使用-d
调试make文件时非常有用,否则你必须涉及大量不必要的输出 .