Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Makefile将在文件更改时链接文件,但不会重新编译更改的源文件_C++_Linux_Makefile - Fatal编程技术网

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

C++ Makefile将在文件更改时链接文件,但不会重新编译更改的源文件,c++,linux,makefile,C++,Linux,Makefile,我有以下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

我有以下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\u VM\u OBJS)
构建规则

如何修复此问题,以便重新编译源文件并重新链接它们


注意:如果我将
$(CXX\u VM\u SRC)
作为
$(CXX\u VM\u OBJS)
的依赖项,那么只要单个文件发生更改,它就会重新编译每个文件。另外,我只关心GNU Make和OSX/Linux环境

在CXX_VM_OBJS的依赖项列表中,尝试添加您希望对象依赖的源文件名,例如:

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

在CXX_VM_OBJS的依赖项列表中,尝试添加您希望对象依赖的源文件名,例如:

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

正如其他人所指出的,当源更改时,makefile不重建任何对象文件的原因是您的规则:

$(CXX_VM_OBJS): $(HDRS)
    ...
没有提到源文件是先决条件。以及建议添加它们的原因:

$(CXX_VM_OBJS): $(HDRS) $(CXX_VM_SRC)
    ...
使Make在任何源文件更改时重建所有源文件,这正是此规则所要求的。它使所有源文件成为任何目标文件的先决条件

正确的处理方法是:


我建议对您的
$(CXX\u TESTBENCH\u OBJS)
规则使用相同的方法;尽管它现在只适用于一个对象文件,但很明显,您正在考虑稍后添加其他对象文件。

正如其他人所指出的,当源更改时,makefile不会重建任何对象文件的原因是您的规则:

$(CXX_VM_OBJS): $(HDRS)
    ...
没有提到源文件是先决条件。以及建议添加它们的原因:

$(CXX_VM_OBJS): $(HDRS) $(CXX_VM_SRC)
    ...
使Make在任何源文件更改时重建所有源文件,这正是此规则所要求的。它使所有源文件成为任何目标文件的先决条件

正确的处理方法是:


我建议对您的
$(CXX\u TESTBENCH\u OBJS)
规则使用相同的方法;尽管它现在只适用于一个对象文件,但很明显,您正在考虑稍后添加其他文件。

这相当于仅向该规则添加
$(CXX\u VM\u SRC)
这相当于仅向该规则添加
$(CXX\u VM\u SRC)