Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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++_C_Makefile - Fatal编程技术网

C++ Makefile,为什么每次都要重新编译?

C++ Makefile,为什么每次都要重新编译?,c++,c,makefile,C++,C,Makefile,我的目录结构是:objFile/cacheOp.o、fileOp.o、Header/cacheOp.h、fileOp.h、Bodyer/cacheOp.cpp、fileOp.cpp 我写了一个Makefile文档: cc=g++ CXXFLAGS=-g -o0 libObjs = objFile/cacheOp.o objFile/fileOp.o all : cacheOpObj testFunc.cpp fileOpObj $(cc) testFunc.cpp objFile/ca

我的目录结构是:objFile/cacheOp.o、fileOp.o、Header/cacheOp.h、fileOp.h、Bodyer/cacheOp.cpp、fileOp.cpp 我写了一个Makefile文档:

cc=g++
CXXFLAGS=-g -o0 
libObjs = objFile/cacheOp.o objFile/fileOp.o
all : cacheOpObj testFunc.cpp fileOpObj
    $(cc) testFunc.cpp objFile/cacheOp.o  -o test $(CXXFLAGS)
cacheOpObj : Header/cacheOp.h Bodyer/cacheOp.cpp
    $(cc) -c Bodyer/cacheOp.cpp  -o objFile/cacheOp.o $(CXXFLAGS)
fileOpObj : Header/fileOp.h Bodyer/fileOp.cpp
    $(cc) -c Bodyer/fileOp.cpp -o objFile/fileOp.o $(CXXFLAGS)
但结果并不像预期的那样

当我执行make命令时,即使我没有做任何更改,它也会执行g++-c Bodyer/cacheOp.cpp-o objFile/cacheOp.o g++-c Bodyer/fileOp.cpp-o objFile/fileOp.o g++testFunc.cpp objFile/cacheOp.o-o测试。如果文件没有更改,它不应该显示它是最新的吗?我在标签中命名了依赖项。
如果你是初学者,你应该避免目标不是真正的文件。在您的情况下,键入make尝试构建第一个目标:all。由于没有这样的文件,它知道必须执行配方才能创建名为all的文件。但在执行此配方之前,它会查看先决条件cacheOpObj、testFunc.cpp和fileOpObj。第一个和第三个也不存在,所以make尝试构建它们

将所有这些替换为:

test: objFile/cacheOp.o testFunc.cpp objFile/fileOp.o
    $(cc) testFunc.cpp objFile/cacheOp.o  -o test $(CXXFLAGS)

objFile/cacheOp.o: Header/cacheOp.h Bodyer/cacheOp.cpp
    $(cc) -c Bodyer/cacheOp.cpp  -o objFile/cacheOp.o $(CXXFLAGS)

objFile/fileOp.o: Header/fileOp.h Bodyer/fileOp.cpp
    $(cc) -c Bodyer/fileOp.cpp -o objFile/fileOp.o $(CXXFLAGS)

请参见,所有目标和先决条件都是真实文件。Make可以检查它们的存在和上次修改时间,以决定要做什么。

如果你在撒谎,请查看以下规则/配方:

cacheOpObj : Header/cacheOp.h Bodyer/cacheOp.cpp
    $(cc) -c Bodyer/cacheOp.cpp  -o objFile/cacheOp.o $(CXXFLAGS)
这意味着如果cacheopbj缺失或早于Header/cacheOp.h或Bodyer/cacheOp.cpp,则此命令将生成它。除此之外,它会创建一个名为objFile/cacheOp.o的文件。因此,让我们每次都重新运行食谱

CXXFLAGS-o0中也有一个输入错误,而不是应该修复的-o0。无论如何,-Og是一个更好的默认值

以下是已清理的makefile版本:

CXXFLAGS=-g -Og 
libObjs=objFile/cacheOp.o objFile/fileOp.o

all: test
test: testFunc.cpp $(libObjs)
    $(CXX) $^ -o $@ $(CXXFLAGS) 

objFile/cacheOp.o: Bodyer/cacheOp.cpp Header/cacheOp.h 
    $(CXX) -c $< -o $@ $(CXXFLAGS)
objFile/fileOp.o: Bodyer/fileOp.cpp Header/fileOp.h 
    $(CXX) -c $< -o $@ $(CXXFLAGS)

请注意自动变量的使用,例如$,您是否尝试删除。PHONY:test?删除后。PHONY:test仍将重新编译