C++ Makefile,为什么每次都要重新编译?
我的目录结构是:objFile/cacheOp.o、fileOp.o、Header/cacheOp.h、fileOp.h、Bodyer/cacheOp.cpp、fileOp.cpp 我写了一个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
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仍将重新编译