我想要的自动生成文件
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
我是 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