【问题标题】:How to compile "not-main" (only .hpp) files with makefile in C++?如何在 C++ 中使用 makefile 编译“非主”(仅 .hpp)文件?
【发布时间】:2015-12-18 17:12:39
【问题描述】:

我正在开发一个包含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 *~

【问题讨论】:

    标签: c++ makefile


    【解决方案1】:

    您的 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 解释了这一切。

    【讨论】:

    • 这是一个简短的demo:运行make setup,然后运行make(在一个空目录中)。
    【解决方案2】:

    为依赖所有(本地,非系统)头文件的源文件添加规则。

    喜欢

    Main.cpp: SomeHeaderFile.hpp SomeOtherHeaderFile.hpp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多