我是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
如何改进工作代码和我想要的东西?
答案 0 :(得分:4)
如果您打算只有一个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)
将在应用程序和库中找到所有标头。可执行文件将取决于所有标头和main.cpp
,因此如果它们中的任何一个发生更改,则将重建二进制文件。
$<
表示&#34;第一个依赖&#34;。这样,只有cpp文件被传递给编译器。
注意:在GNU make约定中,CC和CFLAGS引用C编译器。对于C ++,变量名为CXX和CXXFLAGS。
答案 1 :(得分:2)
这是一个不同的方案:在构建软件时生成依赖关系信息。这适用于创建多个目标文件的多个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
)。
如果相应的.o
文件较新(GNU make的内置规则或手写规则),Make已经知道重建.cpp
个文件。如果makefile中包含.d
个文件,我们告诉make,目标文件也依赖于头文件,并且当其中一个文件发生更改时应该重建。但重建.o
的规则始终为%.o : %.cpp