我正在学习编写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
答案 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 行末尾有多余的空格。我强烈建议使用一个编辑器,该编辑器将使您可视化空白和/或自动删除行尾的多余空白。