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
(在空目录中)。