Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在makefile中使用隐式规则进行清理_C++_Makefile - Fatal编程技术网

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
?不是叮当声++?你提到它的时候,可能是叮当声++在抱怨。