【问题标题】:`Makefile` rule to regenerate object files directory without recompiling from scratch?`Makefile`规则重新生成目标文件目录而不从头开始重新编译?
【发布时间】:2018-10-04 09:51:33
【问题描述】:

我有以下Makefile,它工作得很好,但每次它从头开始重新编译,即使没有任何改变。

CXX = g++

CXXFLAGS = -std=c++11
INC_PATH = `pkg-config --cflags ../openCV/build/lib/pkgconfig/opencv.pc` \
    `pkg-config --cflags ../SDL2-2.0.8/instDir/lib/pkgconfig/sdl2.pc` \
    `pkg-config --cflags ../jsoncpp/build/pkg-config/jsoncpp.pc` \
    -I ../poco/instDir/include/

#LIB_PATH = -L../cmake_bin_dir/lib/ ./gainput/build/lib -L../SDL2-2.0.8/build/ -L../SDL2-2.0.8/build/lib
LIBS =  `pkg-config --libs ../openCV/build//lib/pkgconfig/opencv.pc` \
    `pkg-config --libs ../SDL2-2.0.8/instDir/lib/pkgconfig/sdl2.pc` \
    `pkg-config --libs ../jsoncpp/build/pkg-config/jsoncpp.pc` \
    -L../poco/instDir/lib/ -lPocoNetd -lPocoUtild -lPocoFoundationd \

SOURCEDIR := ./
SOURCES := $(wildcard $(SOURCEDIR)/*.cpp)
OBJDIR=$(SOURCEDIR)/obj

OBJECTS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.o, $(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.d,$(SOURCES))

# ADD MORE WARNINGS!
WARNING := -Wall -Wextra

# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean

# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: parking

clean:
    $(RM) $(OBJECTS) $(DEPENDS) parking

# Linking the executable from the object files
parking: $(OBJECTS)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o $@ $(LIBS)

-include $(DEPENDS)

$(OBJDIR):
    mkdir -p $(OBJDIR)

$(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile $(OBJDIR)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) -MMD -MP -c $< -o $@

问题似乎是这些行

$(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile $(OBJDIR)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) -MMD -MP -c $< -o $@

尤其是来自$(OBJDIR) 的依赖项(其中保存了*.o*.d 文件)实际上,当我删除它时,它似乎没有重新编译。问题是如果我删除$(OBJDIR),目录就不会重新生成。

什么是Makefile规则来重新生成存储目标文件的目录而不从头开始所有编译?

【问题讨论】:

    标签: makefile compilation


    【解决方案1】:

    $(OBJDIR) 是您的目标文件的先决条件。与任何目录一样,每次内容更改时,其最后修改时间都会更改...改为将其声明为order-only prerequisite

    $(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile | $(OBJDIR)
    

    这样,如果它已经存在,make不会考虑它的最后修改时间来决定哪些目标需要重新构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-30
      • 2014-07-05
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多