【问题标题】:How to include clean target in Makefile?如何在 Makefile 中包含干净的目标?
【发布时间】:2011-02-07 19:00:18
【问题描述】:

我有一个像这样的 Makefile

CXX = g++ -O2 -Wall

all: code1 code2

code1: code1.cc utilities.cc
   $(CXX) $^ -o $@

code2: code2.cc utilities.cc
   $(CXX) $^ -o $@

我接下来要做的是包含clean target,这样每次 我运行make,它会在创建新文件之前自动删除code1和code2的现有二进制文件。

我试图将这些行放在 makefile 的最后,但它不起作用

clean: 
    rm -f $@
    echo Clean done

正确的做法是什么?

【问题讨论】:

    标签: unix makefile


    【解决方案1】:

    最好的办法可能是创建一个保存二进制文件的变量:

    binaries=code1 code2
    

    然后在all-target 中使用它,以避免重复:

    all: clean $(binaries)
    

    现在,您也可以将它与 clean-target 一起使用,只需添加一些 glob 即可捕获目标文件和内容:

    .PHONY: clean
    
    clean:
        rm -f $(binaries) *.o
    

    注意使用.PHONY 使clean 成为pseudo-target。这是一个 GNU make 功能,所以如果您需要移植到其他 make 实现,请不要使用它。

    【讨论】:

    • +1 表示.PHONY(这是一种 GNU 主义,但在其他地方基本无害)。但是,将clean 作为all 的依赖项是一个坏主意;这会增加构建时间和噪音。最好定义所有 真正的 依赖项,以便对源代码的更改尽可能准确地传播。
    【解决方案2】:

    在 makefile 语言中,$@ 表示“目标名称”,因此 rm -f $@ 转换为 rm -f clean。

    您需要向rm 指定您要删除的具体内容,例如rm -f *.o code1 code2

    【讨论】:

      【解决方案3】:

      按照它的编写方式,只有在明确调用时才会调用干净规则:

      清理

      我认为这比每次都清洁要好。如果您想按照自己的方式执行此操作,请尝试以下操作:

      CXX = g++ -O2 -Wall 全部:干净的代码1代码2 code1:code1.cc 实用程序.cc $(CXX) $^ -o $@ 代码 2:code2.cc 实用程序.cc $(CXX) $^ -o $@ 干净的: R M ... 回声清洁完成

      【讨论】:

      • 正如 qrdl 解释的那样,这是错误的。 “rm -f $@”变成了“rm -f clean”,这样就不行了。
      • 不反对,但通常这是一个坏主意。除了非常小的项目之外,从头开始构建任何东西都需要一些时间,而且您真的不希望每次进行小的更改时都必须等待那么长时间。
      • bjarkef:对,我刚刚回答了自动删除的部分。 Thomas Padron-McCarthy:同意,这写在我的帖子中。
      • 除了这个不起作用之外,Makefiles 的目标和优势之一是您只需要重新编译您真正需要重新编译的内容,而不是整个项目。每次清洁都会使您失去此功能。
      • 更重要的是,你不能保证 'clean' 会在 'code1' 和 'code2' 之前执行,因为在 'all' 的依赖项中没有排序。
      猜你喜欢
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      相关资源
      最近更新 更多