Makefile删除后不会重新生成主要目标

时间:2019-04-29 09:54:04

标签: makefile

我正在学习编写makefile。我今天遇到一个问题。我的makefile成功地使主要目标成为目标。然后删除主要目标并再次运行“ make”命令。但是makefile并没有成为主要目标,只是显示“ make:`main.o'是最新的”。我不知道为什么这是我的makefile和文件夹结构:

CXX := g++          
FLAGS := -std=c++11                                                                                                                       

INCLUDE_DIR := $(shell find . -type d)
SOURCE_DIR := $(INCLUDE_DIR)

SOURCE_FILE := $(foreach dir, $(SOURCE_DIR), $(wildcard $(dir)/*.cpp))

OBJECT_FILE := $(SOURCE_FILE:%.cpp=%.o)

-include $(OBJECT_FILE:%.o=%.d)

TARGET := app       

all: $(TARGET)      

$(TARGET): $(OBJECT_FILE)
    $(CXX) $(FLAGS) -o $@ $(OBJECT_FILE)

$(OBJECT_FILE): %.o: %.cpp | $(SOURCE_DIR)
    $(CXX) $(FLAGS) -c $< -o $@ -MD -MF $(@:.o=.d)


./-----main.cpp
|---test
    |---func.h
    |---func.cpp

1 个答案:

答案 0 :(得分:2)

除非您选择要在命令行上构建的特定目标(通过make <target>),make始终会选择在makefile中看到的第一个目标作为要构建的默认目标

在makefile中考虑以下几行:

-include $(OBJECT_FILE:%.o=%.d)

TARGET := app

all: $(TARGET)

什么也不构建,所以没有.d文件,因此-include不包含任何内容。然后make查找目标all并将其用作默认目标。

第二次遍历makefile,有 .d文件,因此-include命令包括它们。这些文件定义了一些目标,第一个目标是main.o,因此,这是第一个目标,默认情况下已构建。

您应将-include下移至makefile的 end 并确保all目标始终是第一个构建的目标。

顺便说一句,我不知道这是否是您剪切并粘贴到SO中的产物,但是您的许多行末尾都有多余的空格。您应该注意,在许多地方,makefile中的 IS SIGNIFICANT 行末尾有多余的空格。我强烈建议使用一个编辑器,该编辑器将使您可视化空白和/或自动删除行尾的多余空白。