簡體   English   中英

Makefile循環依賴錯誤

[英]Makefile circular dependency error

我有一個makefile,可以編譯src文件夾中的所有cpp文件。 所有cpp文件都依賴於它們的.h文件。 因此,我有一條規則來做所有這些事情(我認為)。

但是我想從該源文件列表中刪除main.cpp,因為它沒有相應的頭文件。

我有從cpp文件列表中刪除主要代碼的代碼。 然后,我編寫了一條單獨的規則來編譯主體。 我認為這是我犯錯的地方。

這是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依賴項時,錯誤消失了。

循環依賴關系是由WavFileTool之后的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文件時非常有用,否則您將不得不經過很多不必要的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM