【问题标题】:GNU Make: different dependencies of several binaries in the same target?GNU Make:同一目标中多个二进制文件的不同依赖项?
【发布时间】:2013-03-25 17:52:02
【问题描述】:

首先,我对 GNU Make 并不熟悉,所以如果我陈述了一些可笑的错误概念,请纠正它们而不是取笑我,谢谢。

我想要一个默认目标来构建具有不同依赖项的多个可执行文件,但我想不通。这是我正在使用的一个最小示例:

    CC = gcc-4.8
    CFLAGS = # some compiler flags
    LDFLAGS = # some linker flags
    SOURCES = prog1.c prog2.c
    OBJECTS = $(SOURCES:.c=.o)
    TARGET = prog1 prog2

    $(TARGET) : $(OBJECTS)
            $(CC) $(CFLAGS) -o prog1 prog1.o $(LDFLAGS)
            $(CC) $(CFLAGS) -o prog2 prog2.o $(LDFLAGS)

    .PHONY: clean

    clean:
            @rm -f $(TARGET) $(OBJECTS) core

但是,如您所见,虽然prog2prog1.c 完全没有关系,但编辑prog1.c 将导致prog2 的重新链接。有什么办法可以预防吗?

(另外,如果有人能指导我学习 GNU Make 的优秀教程,我将不胜感激。官方文档非常庞大......)

【问题讨论】:

    标签: c makefile dependencies target


    【解决方案1】:

    每个目标都必须有自己的一套先决条件;如果你写:

    foo bar: biz baz
    

    这意味着“foo 依赖于 biz 和 baz,bar 也依赖于 biz 和 baz”。你想写:

    prog1: prog1.o
            $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
    prog2: prog2.o
            $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
    

    或者,您可以在同一规则中编写两个目标并分别定义先决条件:

    prog1 prog2:
            $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
    prog1: prog1.o
    prog2: prog2.o
    

    有很多方法可以让这变得更复杂并减少打字。这就是 make 的全部意义所在。

    更新

    要默认同时构建两个目标,请使用

    all: prog1 prog2
    
    prog1 prog2:
            $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
    prog1: prog1.o
    prog2: prog2.o
    

    all 是第一个目标。

    【讨论】:

    • 感谢您的回答,但您的解决方案创建了两个目标;只有第一个可以默认,第二个需要make prog2手动调用。理想的情况是输入一次make 并构建两个可执行文件,就像我在上面给出的示例中一样(尽管依赖关系很奇怪)。根据您的回答,似乎理想情况无法实现?
    • Make 默认构建它找到的第一个(非规则)目标。因此,如果您有一个目标all: prog1 prog2,那么makemake all 将构建all 目标,这意味着它必须首先构建您正在寻找的prog? 目标。
    • @NormanGray 太好了,这正是我想要的。非常感谢。
    • @KevinSayHi 下次你提出这样的编辑建议时,请写下它来自评论线程和答案的海报,所以我们知道它来自哪里!否则最有可能被拒绝。
    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多