1
私はmakefileを修正するのに1時間以上をかけてきましたが、修正する以上に壊れています。とにかく、私はかなり(非常に)Makefileに新しく、私は経験がほとんどないです。私の問題は、オブジェクトファイルが既にビルドされていてもソースが更新されていなくても、makefileがすべての単一のソースファイルを再コンパイルすることです。 makefileは宣言型プログラミングと非常によく似ているので、何が間違っているのか正しいのか分かりません。簡単な説明は、この分野での私の知識を買うためmakefileがすべてのソースファイルを再コンパイルしないようにします
申し訳ありませんが
$(BUILD)/%.o: %.cpp
あなたのラインは、あなたのオブジェクトファイルがから構築されていると言うべきである...
#---------------------------------------------------------
# Compiler and linker flags
#---------------------------------------------------------
CC = g++
CMNFLAGS = -ggdb3 -Wextra -Wall -Wno-int-to-pointer-cast -Wno-reorder -Wno- write-strings -DOPT_TYPE="\"debugging\""
CFLAGS = $(CMNFLAGS) -fPIC
LDFLAGS = $(CMNFLAGS) -shared -ldl -lm -static-libgcc
#---------------------------------------------------------
# All the different directories
#---------------------------------------------------------
BUILD = build
SOURCE = source
INCLUDE = include
TARGET = $(BUILD)/$(shell basename $(CURDIR))_mm_i386.so
#---------------------------------------------------------
# Directory and include variables/files
#---------------------------------------------------------
SRCSDK = ../sdk
METADIR = $(INCLUDE)/metafiles
INSTDIR = /usr/local/test/$(shell basename $(CURDIR))/dlls
INCLUDES = -I$(INCLUDE) -I$(METADIR) -I$(SRCSDK)/engine -I$(SRCSDK)/common \
-I$(SRCSDK)/pm_shared -I$(SRCSDK)/dlls -I$(SRCSDK)
#---------------------------------------------------------
# Special variables
#---------------------------------------------------------
VPATH = $(SOURCE) $(foreach dir, $(MODULES), $(SOURCE)/$(dir))
#---------------------------------------------------------
# Source and object files
#---------------------------------------------------------
MODULES = game
SRC_DIR = $(addprefix $(SOURCE)/, $(MODULES))
SOURCES = $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.cpp))
SOURCES += $(wildcard $(SOURCE)/*.cpp)
OBJECTS = $(foreach dir, $(SOURCES:.cpp=.o), $(BUILD)/$(notdir $(dir)))
#---------------------------------------------------------
# All the makefile directives
#---------------------------------------------------------
.PHONY: clean install
all: $(SOURCES) $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o [email protected]
$(BUILD)/%.o: %.cpp $(BUILD)
$(CC) $(CFLAGS) $(INCLUDES) -o [email protected] -c $<
$(BUILD):
@mkdir [email protected]
clean:
-rm -r $(BUILD)
@echo clean...
install: $(TARGET)
@cp $(TARGET) $(INSTDIR)
@echo installation done...
ありがとう、完璧に近づいた、ちょっとしたことが1つあります。 makeと呼ばれるたびにビルドディレクトリを作成するための前提条件をそこに置くことを覚えています。この設定では、ビルドディレクトリは前提条件ではないため、作成されません。どんな考え? –
@Elliott:注文専用の前提条件を使用することができます。たとえば、http://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.htmlの下部を参照してください。 – Idelic
@Idelic - クール、私は前にその構文を見たことがない。ありがとう! –