【发布时间】:2017-11-13 19:56:21
【问题描述】:
我有以下看起来运行良好的 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 环境。
【问题讨论】: