C++ 在makefile中使用隐式规则进行清理
当我做C++ 在makefile中使用隐式规则进行清理,c++,makefile,C++,Makefile,当我做makeclean时,它会抱怨缺少文件。它特别抱怨nstest.cc和nstime.cc中包含的mapnameserver.h。 我认为做makeclean会忽略所有其他目标,甚至是隐含的目标 我想要的是能够做到makeclean和makevectornameserver,而不必抱怨nstest.cc和nstime.cc包含的我尚未编写的头。这可能吗 下面是src目录中的文件 nameserverinterface.h nstest.cc nstime.cc vectornameserve
makeclean
时,它会抱怨缺少文件。它特别抱怨nstest.cc
和nstime.cc
中包含的mapnameserver.h
。
我认为做makeclean
会忽略所有其他目标,甚至是隐含的目标
我想要的是能够做到makeclean
和makevectornameserver
,而不必抱怨nstest.cc和nstime.cc包含的我尚未编写的头。这可能吗
下面是src目录中的文件
nameserverinterface.h
nstest.cc
nstime.cc
vectornameserver.cc
vectornameserver.h
这是Makefile
#
# Makefile for CPP
#
# Compiler and compiler options:
CC = /usr/local/bin/clang++
CXX = /usr/local/bin/clang++
CXXFLAGS = -c -pipe -O2 -Wall -W -ansi -pedantic-errors
CXXFLAGS += -Wmissing-braces -Wparentheses -Wold-style-cast
CXXFLAGS += -std=c++11 -stdlib=libc++ -nostdinc++
CXXFLAGS += -I/Users/einar/devel/libcxx/include/
LDFLAGS = -stdlib=libc++
LDLIBS = -L/Users/einar/devel/libcxx/lib/
SRCDIR = ../src
LIBDIR = ../lib
BINDIR = ../bin
DEPDIR = ../dep
VPATH = $(SRCDIR):$(LIBDIR):$(BINDIR):$(DEPDIR)
LIB_INSTALL =
BIN_INSTALL =
SRC = $(wildcard $(SRCDIR)/*.cc)
OBJ = $(notdir $(SRC:.cc=.o))
DEP = $(addprefix $(DEPDIR)/, $(notdir $(SRC:.cc=.d)))
PROGS = vectornameserver
MAKEDEPEND = $(CXX) -MM $(CPPFLAGS) -o $*.d $<
CP = /bin/cp
###
#
# Phony targets
#
###
.PHONY: all
all: $(PROGS)
.PHONY: folder_setup
folder_setup:
mkdir -p $(SRCDIR)
mkdir -p $(LIBDIR)
mkdir -p $(BINDIR)
mkdir -p $(DEPDIR)
.PHONY: clean
clean:
@$(RM) $(OBJ)
.PHONY: cleaner
cleaner:
@$(RM) $(OBJ)
@$(RM) $(PROGS)
@$(RM) $(DEP)
@$(RM) $(wildcard $(DEPDIR)/*.d*)
###
#
# Set up targets for program files in this section
# a rule should look like:
# program: obj1.o obj2.o ...
#
###
vectornameserver : vectornameserver.o
###
#
# In this section automatic dependencies are handled.
#
###
$(addprefix $(DEPDIR)/, %.d): %.cc
@set -e; rm -f $@; \
$(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@: ,g' < $@.$$$$ \
> $@; rm -f $@.$$$$
###
#
# Include the automatically generated dependency files
#
###
include $(DEP)
#
#CPP的Makefile
#
#编译器和编译器选项:
CC=/usr/local/bin/clang++
CXX=/usr/local/bin/clang++
CXXFLAGS=-c-管道-O2-墙壁-W-ansi-迂腐错误
CXXFLAGS+=-Wmissing大括号-WPARENTESES-Wold样式转换
CXXFLAGS+=-std=c++11-stdlib=libc++-nostdinc++
CXXFLAGS+=-I/Users/einar/devel/libcxx/include/
LDFLAGS=-stdlib=libc++
LDLIBS=-L/Users/einar/devel/libcxx/lib/
SRCDIR=../src
LIBDIR=../lib
BINDIR=../bin
DEPDIR=../dep
VPATH=$(SRCDIR):$(LIBDIR):$(BINDIR):$(DEPDIR)
LIB_安装=
BIN_安装=
SRC=$(通配符$(SRCDIR)/*.cc)
OBJ=$(notdir$(SRC:.cc=.o))
DEP=$(addprefix$(DEPDIR)/,$(notdir$(SRC:.cc=.d)))
PROGS=vectornameserver
MakeDependen=$(CXX)-MM$(CPPFLAGS)-o$*.d$<
CP=/bin/CP
###
#
#假目标
#
###
冒牌货:全部
全部:$(进度)
.PHONY:文件夹设置
文件夹\u设置:
mkdir-p$(SRCDIR)
mkdir-p$(LIBDIR)
mkdir-p$(BINDIR)
mkdir-p$(DEPDIR)
.假冒:干净
清洁:
@$(RM)$(OBJ)
.冒牌货:清洁工
清洁剂:
@$(RM)$(OBJ)
@$(RM)$(进度)
@$(RM)$(DEP)
@$(RM)$(通配符$(DEPDIR)/*.d*)
###
#
#在本节中设置程序文件的目标
#规则应该如下所示:
#程序:obj1.o obj2.o。。。
#
###
vectornameserver:vectornameserver.o
###
#
#在本节中,将处理自动依赖项。
#
###
$(addprefix$(DEPDIR)/,%.d):%.cc
@set-e;rm-f$@\
$(CXX)-MM$(CPPFLAGS)$<>$@。$$$$\
sed's,\($*\)\.o[:]*,\1.o$@:,g'<$@.$$$\
> $@; rm-f$@$$$$
###
#
#包括自动生成的依赖项文件
#
###
包括美元(DEP)
提前感谢。问题是在makefile中有一个
include
指令。这会隐式地使所有包含的依赖项文件成为隐式目标,在运行主目标之前必须刷新这些目标。正是这些规则在运行编译器并向您提供错误
由于如果只是进行清理,通常不需要依赖项文件,因此通常的做法是将适当的if
s包装在include
周围:
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),cleaner)
-include $(DEP)
endif
endif
如果您执行
makeclean
或makecleaner
,这将避免尝试包含dep文件(从而重新生成它们)。此外,include上的-
前缀禁止在首次运行make时发出关于depfiles不存在的警告(它将(重新)生成它们,并在需要时重新读取makefile和depfiles)。问题在于makefile中有一个include
指令。这会隐式地使所有包含的依赖项文件成为隐式目标,在运行主目标之前必须刷新这些目标。正是这些规则在运行编译器并向您提供错误
由于如果只是进行清理,通常不需要依赖项文件,因此通常的做法是将适当的if
s包装在include
周围:
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),cleaner)
-include $(DEP)
endif
endif
如果您执行
makeclean
或makecleaner
,这将避免尝试包含dep文件(从而重新生成它们)。此外,include上的-
前缀禁止在您第一次运行make时发出关于depfiles不存在的警告(它将(重新)生成它们,并在需要时重新读取makefile和depfiles)。您确定make正在抱怨缺少mapnameserver.h
?不是clang++?您提到它后,可能是clang++在抱怨。您确定Make在抱怨缺少mapnameserver.h
?不是叮当声++?你提到它的时候,可能是叮当声++在抱怨。