我正在开发一个带有一个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)
您的 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)
许多教程都解释了这一切。