Compilation 阻止makefile重新编译所有源文件
我已经尝试了一个多小时来修复我的makefile,但是我破坏的比修复的多。无论如何,我对制作文件非常陌生,而且我几乎没有经验。我的问题是,我的makefile重新编译每一个源文件,即使目标文件已经生成并且源文件还没有更新。因为makefile很像声明式编程,所以我不知道我做错了什么或做对了什么 很抱歉简短的描述,我在这方面的知识非常有限Compilation 阻止makefile重新编译所有源文件,compilation,makefile,Compilation,Makefile,我已经尝试了一个多小时来修复我的makefile,但是我破坏的比修复的多。无论如何,我对制作文件非常陌生,而且我几乎没有经验。我的问题是,我的makefile重新编译每一个源文件,即使目标文件已经生成并且源文件还没有更新。因为makefile很像声明式编程,所以我不知道我做错了什么或做对了什么 很抱歉简短的描述,我在这方面的知识非常有限 #--------------------------------------------------------- # Compiler and linker
#---------------------------------------------------------
# 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 $@
$(BUILD)/%.o: %.cpp $(BUILD)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<
$(BUILD):
@mkdir $@
clean:
-rm -r $(BUILD)
@echo clean...
install: $(TARGET)
@cp $(TARGET) $(INSTDIR)
@echo installation done...
应该是
$(BUILD)/%.o: %.cpp
您的行表示您的对象文件是从包含它们的目录构建的。几乎任何操作都会更新构建目录的时间戳,因此对象几乎总是过时的
应该是
$(BUILD)/%.o: %.cpp
您的行表示您的对象文件是从包含它们的目录构建的。几乎任何操作都会更新生成目录的时间戳,因此对象几乎总是过时的。谢谢,工作接近完美,只有一件事。我记得我把这个先决条件放在那里,每当我调用make时,它都会创建“build”目录。使用此设置,生成目录不是先决条件,因此不会创建它。知道为什么吗?@Elliott:你可以使用订单的先决条件。看,例如,底部。谢谢,工作接近完美,只有一件小事。我记得我把这个先决条件放在那里,每当我调用make时,它都会创建“build”目录。使用此设置,生成目录不是先决条件,因此不会创建它。知道为什么吗?@Elliott:你可以使用订单的先决条件。例如,请参见的底部。