gpt4 book ai didi

c++ - Makefile 将在文件更改时链接文件,但不会重新编译更改的源文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:30 30 4
gpt4 key购买 nike

我有以下 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)
...

导致 Make 在任何 源文件更改时重建所有 源文件,这正是该规则所要求的。它使所有 源文件成为任何 目标文件的先决条件。

处理此问题的正确方法是使用 static pattern rule :

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

我会为您的 $(CXX_TESTBENCH_OBJS) 规则推荐相同的规则;即使它现在只适用于一个目标文件,很明显您正在考虑稍后添加其他目标文件。

关于c++ - Makefile 将在文件更改时链接文件,但不会重新编译更改的源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47272487/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com