C++ 如何编写;“不主要”;(仅.hpp)在C++;?

C++ 如何编写;“不主要”;(仅.hpp)在C++;?,c++,makefile,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/b

我正在开发一个带有
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 *~
FF_ROOT=/home/luca/fastflow
BOOST\u ROOT=/home/luca/BOOST\u 1\u 59\u 0
CC=icpc-mmic
CXX=$(CC)-std=c++11-DNO\U默认\U映射
INCLUDES=-I$(BOOST\u ROOT)-I$(FF\u ROOT)
CXXFLAGS=
LDFLAGS=-pthread
OPTFLAGS=-O3-finline函数-DNDEBUG-g-O0
目标=\
主要\
.伪造:所有干净副本执行器所有干净副本
.后缀:.cpp
%:%cpp
$(CXX)$(CXXFLAGS)$(包括)$(OPTFLAGS)-o$@$<$(LDFLAGS)
全部:编译
编译:$(目标)
副本:
scp$(目标)mic0:
执行官:
ssh mic0'/$(目标)$(参数)'
清洁:
rm-f$(目标)
干净利落:干净利落
\rm-f*.o*~

为源文件添加一条规则,该规则依赖于所有(本地而非系统)头文件


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


你的Makefile显然是不够的。目前,它只包含从一个输入到下一个输入的转换命令,但它缺少任何构建系统的关键组成部分:依赖性

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


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

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
OBJS:=a.o b.o c.o
main:$(OBJS)
$(CXX)$(CXXFLAGS)$(LDFLAGS)$<-o$@
.cc.o:
$(CXX)$(CXXFLAGS)-c$<-o$@
#依赖关系!这是对上面隐含的“foo.o:foo.cc”的补充。
a、 o:a.h b.h工具
b、 o:b.h工具
c、 o:c.h b.h怪人

许多人解释了这一切。

你的Makefile显然是不够的。目前,它只包含从一个输入到下一个输入的转换命令,但它缺少任何构建系统的关键组成部分:依赖性

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


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

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
OBJS:=a.o b.o c.o
main:$(OBJS)
$(CXX)$(CXXFLAGS)$(LDFLAGS)$<-o$@
.cc.o:
$(CXX)$(CXXFLAGS)-c$<-o$@
#依赖关系!这是对上面隐含的“foo.o:foo.cc”的补充。
a、 o:a.h b.h工具
b、 o:b.h工具
c、 o:c.h b.h怪人
许多人解释了这一切。

这里有一个简短的例子:运行
make setup
,然后
make
(在空目录中)。这里有一个简短的例子:运行
make setup
,然后
make
(在空目录中)。