如何在 C++ 中使用 makefile 编译“非主”(仅 .hpp)文件?

jus*_*rld 0 c++ makefile

我正在开发一个带有一个Main.cpp和一组.hpp文件的并行项目。我发现Makefile以下内容适合在 Xeon Phi 上编译、部署和执行我的项目。这里的问题是,如果我只编辑其中之一.hpp(所以不是Main.cpp),那么当我执行时make compile显然什么也不会发生(所以我必须make clean在之前执行)。你能帮我改变它,这样如果我编辑file.hpp它就会编译它吗?谢谢!

FF_ROOT     = /home/luca/fastflow
BOOST_ROOT  = /home/luca/boost_1_59_0
CC      = icpc -mmic
CXX     = $(CC) -std=c++11 -DNO_DEFAULT_MAPPING
INCLUDES    = -I $(BOOST_ROOT) -I $(FF_ROOT) 
CXXFLAGS    = 

LDFLAGS     = -pthread
OPTFLAGS    = -O3 -finline-functions -DNDEBUG -g -O0

TARGETS     =               \
        Main                \

.PHONY: all clean copy exec cleanall
.SUFFIXES: .cpp 

%: %.cpp
    $(CXX) $(CXXFLAGS) $(INCLUDES) $(OPTFLAGS) -o $@ $< $(LDFLAGS)

all: compile

compile: $(TARGETS)

copy:   
        scp $(TARGETS) mic0:
exec:   
        ssh mic0 './$(TARGETS) $(ARGS)'
clean: 
        rm -f $(TARGETS)
cleanall    : clean
        \rm -f *.o *~
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

您的 Makefile 明显不够。目前它只包含从一个输入转换到下一个输入的命令,但它缺少任何构建系统的关键要素:依赖关系。

依赖关系很难手动维护。您可以main: a.hpp b.hpp手动添加等,但这无法扩展,并且在重构时您会忘记更新它。这就是为什么make用户通常不应该直接使用它。make有点像汇编程序:它是表达构建规则的最终级别,但创建构建规则最好留给更高级别的系统(例如 automake 或 cmake 或该领域的任何其他竞争对手;甚至是旧的系统)makedepend)。


附带说明一下,您确实不想直接从源代码构建二进制文件,这会破坏 Makefile 的几乎所有要点。您确实希望将项目分解为单独编译的翻译单元,以便在更改后仅重建最少量的翻译单元。

OBJS := a.o b.o c.o

main: $(OBJS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $< -o $@

.cc.o:
    $(CXX) $(CXXFLAGS) -c $< -o $@

# Dependencies! This is in addition to the implied "foo.o: foo.cc" above.

a.o: a.h b.h tools.h
b.o: b.h tools.h
c.o: c.h b.h weirdstuff.h
Run Code Online (Sandbox Code Playgroud)

许多教程都解释了这一切。