我想要的自动生成文件

My desired automatic make file

我是 make 文件的新手。

我有一个程序

main.cpp
types.hpp
application/coordinator.hpp
application/correlation.hpp
application/handler.hpp
application/settings.hpp
libraries/basket.hpp
libraries/config.hpp
libraries/graphics.hpp
...

我有很多文件,我的文件列表会更新很多次。我希望 make 文件自动识别要生成或更新哪个 .o 文件。我不想在每次创建和包含新文件时都更新我的 make 文件。输出必须在名为 bin

的目录中生成

main.cpp 是我唯一的 cpp 文件,其余文件是 hpp.

直到现在,这个 link 启发了我写这段代码:

CC=g++
CFLAGS= -g -Wfatal-errors 

CFLAGS+= -std=c++11
LIBS= -lboost_filesystem -lboost_system

all: run

run: $(OBJS)
    $(CC) $(CFLAGS) $^ main.cpp -o $@

$(OBJS): bin/%.o : bin/%.hpp

如何将其改进为工作代码以及我想要的?

如果您打算只拥有一个 cpp 文件,您可以按以下方式编写 makefile:

CXX := g++
CXXFLAGS := -g -Wall -pedantic -Wextra

HEADERS := types.hpp $(wildcard application/*.hpp) $(wildcard libraries/*.hpp)

all: run

run: main.cpp $(HEADERS)
    $(CXX) $(CXXFLAGS) $< -o $@

$(wildcard) 将在应用程序和库中找到所有 headers。可执行文件将依赖于所有 headers 和 main.cpp,因此如果它们中的任何一个发生变化,二进制文件将被重建。

$< 表示 "first dependency"。这样,只有cpp文件被传递给编译器。

注意:在 GNU make 约定中,CC 和 CFLAGS 指的是 C 编译器。对于 C++,变量命名为 CXX 和 CXXFLAGS。

这里有一个不同的方案:在构建软件时生成依赖信息。这适用于创建多个目标文件的多个 cpp 文件。

CXX := g++
#CPPFLAGS := preprocessor flags, e.g. -I and -D
CXXFLAGS := -g -Wall -pedantic -Wextra -Wfatal-errors -std=c++11 -MD -MP

SOURCES := main.cpp
OBJECTS := $(SOURCES:.cpp=.o)
DEPFILES:= $(OBJECTS:.o=.d)

all: run

# Link the executable
run: $(OBJECTS)
    $(CXX) $(LDFLAGS) $^ -o $@ $(LIBS)

-include $(DEPFILES)

构建 .o 个文件时,-MD -MP 标志告诉编译器生成依赖文件作为副作用。如果这些依赖文件存在,它们将包含在 makefile 中。

这使用了 GNU make 的内置 %.o : %.cpp 规则。我们只是向它提供参数 (CXX, CPPFLAGS, CXXFLAGS).

如果相应的 .cpp 文件较新(GNU make 的内置规则或手写规则),Make 已经知道要重建 .o 文件。通过将 .d 个文件包含到 makefile 中,我们告诉 make 目标文件也依赖于头文件,并且当其中一个文件发生变化时应该重建。但是重建 .o 的规则总是 %.o : %.cpp