我正在使用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 *~
答案 0 :(得分:4)
你的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
许多tutorials解释了这一切。