我想要的自动make文件

时间:2015-02-19 08:57:47

标签: c++ makefile gnu-make

我是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

如何改进工作代码和我想要的东西?

2 个答案:

答案 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规则。我们只为其提供参数(CXXCPPFLAGSCXXFLAGS)。

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