簡體   English   中英

Makefile將在文件更改時鏈接文件,但不會重新編譯更改的源文件

[英]Makefile will link files upon a file change, but not recompile the source file that changed

我有以下makefile文件,它似乎運行得很好:

HDRS =  include/config.h include/opcode_def.h include/x86lib.h include/x86lib_internal.h
CXX ?= g++
AR ?= ar


TEST_CC ?= i386-elf-gcc
TEST_CFLAGS ?= -fdata-sections -ffunction-sections


CXX_VM_SRC = vm/x86lib.cpp vm/modrm.cpp vm/device_manager.cpp vm/cpu_helpers.cpp vm/ops/strings.cpp vm/ops/store.cpp vm/ops/maths.cpp \
          vm/ops/groups.cpp vm/ops/flow.cpp vm/ops/flags.cpp vm/ops/etc.cpp

CXX_VM_OBJS = $(subst .cpp,.o,$(CXX_VM_SRC))

CXX_TESTBENCH_SRC = testbench/testbench.cpp

CXX_TESTBENCH_OBJS = $(subst .cpp,.o,$(CXX_TESTBENCH_SRC))


CXXFLAGS ?= -Wall -g3 -fexceptions -fPIC -Wall
CXXFLAGS += -DX86LIB_BUILD -I./include

VERSION=1.1

VM_OUTPUTS = libx86lib.a libx86lib.so.$(VERSION)
OUTPUTS = $(VM_OUTPUTS) x86testbench 

default: build

build: $(OUTPUTS)

libx86lib.a: $(CXX_VM_OBJS) $(CXX_VM_SRC)
    ar crs libx86lib.a $(CXX_VM_OBJS)

libx86lib.so.$(VERSION): $(CXX_VM_OBJS) $(CXX_VM_SRC)
    $(CXX) -shared $(CXX_VM_OBJS) -o libx86lib.so.$(VERSION)

x86testbench: $(CXX_TESTBENCH_OBJS) $(VM_OUTPUTS)
    $(CXX) $(CXXFLAGS) -static -o x86testbench $(CXX_TESTBENCH_OBJS) -lx86lib -L.

$(CXX_TESTBENCH_OBJS): $(HDRS)
    $(CXX) $(CXXFLAGS) -c $*.cpp -o $@

$(CXX_VM_OBJS): $(HDRS)
    $(CXX) $(CXXFLAGS) -c $*.cpp -o $@

clean:
    rm $(CXX_VM_OBJS) $(OUTPUTS) $(CXX_TESTBENCH_OBJS)

我的問題是,如果更改文件,例如“ vm / x86lib.cpp”,它將重新鏈接最終輸出等,但不會重新編譯vm / x86lib.o。 我不知道如何將這種重新編譯要求表達為$(CXX_VM_OBJS)構建規則。

如何解決此問題,以便它將重新編譯我的源文件並重新鏈接它們?

注意:如果我把$(CXX_VM_SRC)作為對$(CXX_VM_OBJS)的依賴,那么只要單個文件發生更改,它將重新編譯每個文件。 另外,我只關心GNU Make和OSX / Linux環境。

正如其他人指出的那樣,當源更改時,makefile不會重建任何目標文件的原因是您的規則:

$(CXX_VM_OBJS): $(HDRS)
    ...

沒有提到源文件是先決條件。 以及提議添加這些解決方案的原因:

$(CXX_VM_OBJS): $(HDRS) $(CXX_VM_SRC)
    ...

原因使重建的所有源文件時源文件的變化,是這正是這算什么規則的要求。 它使所有源文件成為任何目標文件的先決條件。

處理此問題的正確方法是使用靜態模式規則

$(CXX_VM_OBJS): %.o: %.cpp $(HDRS)
    ...

對於您的$(CXX_TESTBENCH_OBJS)規則,我也建議這樣做; 即使現在僅適用於一個目標文件,也很明顯,您正在考慮稍后再添加其他目標文件。

在CXX_VM_OBJS的依賴項列表中,嘗試添加您希望對象依賴的源文件名,例如:

$(CXX_VM_OBJS): $(HDRS) vm/x86lib.cpp
    $(CXX) $(CXXFLAGS) -c $*.cpp -o $@

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM