如何编译" not-main" (仅限.hpp)使用C ++中的makefile文件?

时间:2015-12-18 08:55:11

标签: 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 *~

1 个答案:

答案 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解释了这一切。