【问题标题】:Prevent makefile from recompiling all source files防止 makefile 重新编译所有源文件
【发布时间】:2012-04-30 03:04:02
【问题描述】:

我已经尝试了一个多小时来修复我的 makefile,但我破坏的比我修复的要多。无论如何,我对 Makefiles 很(非常)新,我几乎没有经验。我的问题是即使目标文件已经构建(并且源尚未更新),我的 makefile 也会重新编译每个源文件。由于 makefile 很像声明式编程,我不知道我做错了什么。

对不起,我在这方面的知识非常有限......

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

【问题讨论】:

    标签: compilation makefile


    【解决方案1】:
    $(BUILD)/%.o: %.cpp $(BUILD)
    

    应该是

    $(BUILD)/%.o: %.cpp
    

    您的行说您的目标文件是从包含它们的目录构建的。几乎任何操作都会更新构建目录的时间戳,因此您的对象几乎总是过期的。

    【讨论】:

    • 谢谢,工作接近完美,只有一件小事。我记得我把这个先决条件放在那里,以便在我调用 make 时创建“构建”目录。使用此设置,构建目录不是先决条件,因此不会创建它。知道为什么吗?
    • @Elliott:您可以为此使用仅限订单的先决条件。例如,参见gnu.org/software/make/manual/html_node/Prerequisite-Types.html 的底部。
    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多