【问题标题】:Makefile runs but does not clean object files and executable fileMakefile 运行但不清理目标文件和可执行文件
【发布时间】:2016-11-04 00:02:43
【问题描述】:

我的makefile 运行,但它不执行rm -f $(PROJECT) $(OBJ) 指定的目标文件和可执行文件的清理。我做错了什么?

制作文件

PROJECT = cfind
HEADERS = $(cfind.h)
OBJ = argv.o globals.o main.o pathInfo.o

C99 = cc -std=c99
CFLAGS = -Wall -pedantic -Werror

$(PROJECT) : $(OBJ)
    $(C99) $(CFLAGS) -o $(PROJECT) $(OBJ)

%.o : %.c $(HEADERS)
    $(C99) $(CFLAGS) -c $<

clean:
    rm -f $(PROJECT) $(OBJ)

【问题讨论】:

  • 你使用什么命令来运行makefile?如果不是make clean,为什么要成为那个目标?
  • make 系统的主要目标之一是只运行需要运行以指定目标的内容。
  • 你告诉它要制定什么目标?它会做任何你告诉它做的目标。如果不指定目标,则使用 makefile 中的第一个目标。
  • 如果要设为默认目标就对了。如果您希望clean 成为默认目标的一部分,请将$(PROJECT) : $(OBJ) 更改为$(PROJECT) : clean $(OBJ) 来添加它。但这太愚蠢了——为什么让它依赖于它无论如何都要删除的文件呢?为什么即使什么都没有改变,你还要它重建项目?
  • 不,使用该目标是因为它是第一个目标的依赖项。第一个目标将$(OBJ) 作为依赖项。说argv.o 不存在。然后make 会知道它需要这样做才能创建默认目标,因此它会为此查找规则,并匹配%.o 规则。 $(OBJ) 表示如果不首先确保 $(OBJ) 中的所有内容都是最新的,您就无法实现该目标。

标签: c shell makefile


【解决方案1】:

当你执行make 时,它会生成你告诉它生成的任何目标。除非您告诉它创建clean 目标,或者该目标是您告诉它创建的目标的依赖项,否则它不会创建该目标。 makefile 和指定依赖项(而不仅仅是使用构建脚本)的主要目的是仅执行所需的操作。默认情况下,make 在 makefile 中创建第一个目标。

我认为您缺少生成文件的全部要点以及指定依赖项的原因。您拥有$(PROJECT) : $(OBJ) 的原因是它知道如果目标文件没有更改,它就不必创建该目标。

即使什么都没有改变,为什么还要它重建项目?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多