1

私がやるmake cleanと、ファイルが見つからないと文句を言います。特に、とmapnameserver.hに含まれていることについて文句を言います。実行すると、暗黙のターゲットであっても、他のすべてのターゲットが無視されると思いました。nstest.ccnstime.ccmake clean

私が望んでいるのは、まだ書いていない nstest.cc と nstime.cc に含まれるヘッダーについて不平を言うことなくできるようmake cleanにすることです。make vectornameserverこれは可能ですか?

以下は、srcディレクトリ内のファイルです

nameserverinterface.h
nstest.cc
nstime.cc
vectornameserver.cc
vectornameserver.h

そして、これがメイクファイルです

#
# 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)

前もって感謝します。

4

1 に答える 1

1

問題はinclude、メイクファイルにディレクティブがあることです。これにより、含まれているすべての依存関係ファイルが、プライマリ ターゲットを実行する前に更新する必要がある暗黙的なターゲットになります。コンパイラを実行してエラーを発生させているのは、これらのルールです。

通常、make clean を行っているだけの場合、依存ファイルは必要ない/必要ないため、通常は次のように適切なifs をラップしincludeます。

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),cleaner)
-include $(DEP)
endif
endif

これにより、make cleanまたはmake cleaner. さらに-、インクルードのプレフィックスは、最初に make を実行したときに depfile が存在しないという警告を抑制します (必要に応じて、depfile を (再) 生成し、makefile と depfile を再読み込みします)。

于 2013-02-23T23:28:14.573 に答える