【问题标题】:Makefile, Why is it recompiled every time?Makefile,为什么每次都要重新编译?
【发布时间】:2021-02-25 10:25:28
【问题描述】:

我的目录结构是: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)

但结果并不如预期。

  1. 当我执行make命令时,即使我不做任何更改,它也会执行g++ -c Bodyer/cacheOp.cpp -o objFile/cacheOp.og++ -c Bodyer/fileOp.cpp -o objFile/fileOp.og++ testFunc.cpp objFile/cacheOp.o -o test。如果文件没有改变,它不应该显示它是最新的吗?我在标签中命名了依赖项。

【问题讨论】:

  • 你试过删除.PHONY: test吗?
  • 去掉.PHONY:test后,还是会重新编译

标签: c++ c makefile


【解决方案1】:

你在撒谎,看看这个规则/食谱:

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

这意味着“如果cacheOpObj 缺失或早于Header/cacheOp.hBodyer/cacheOp.cpp,此命令将生成它”。除非它没有,否则它会创建一个名为 objFile/cacheOp.o 的文件。所以 Make 每次都重新运行配方。

您的 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)

注意使用自动变量,例如$&lt;(第一个输入)、$^(所有输入)、$@(输出)来缩短配方。

【讨论】:

    【解决方案2】:

    如果您是 make 初学者,您应该避免使用非真实文件的目标。在您的情况下,当您键入 make 时,make 会尝试构建第一个目标:all。由于没有这样的文件,它知道必须执行配方才能创建名为all 的文件。但在执行此配方之前,它会查看先决条件(cacheOpObjtestFunc.cppfileOpObj)。第一个和第三个都不存在,所以 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可以检查它们的存在和最后修改时间来决定做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-07-23
      相关资源
      最近更新 更多