关于makefile中的执行顺序

关于makefile中的执行顺序,makefile,Makefile,在此生成文件中: ifeq ($(shell uname),Darwin) LDFLAGS := -Wl,-dead_strip else LDFLAGS := -Wl,--gc-sections -lpthread -ldl endif all: target/double target/double target: mkdir -p $@ target/double: target/main.o target/debug/libdouble_input.

在此生成文件中:

ifeq ($(shell uname),Darwin)
    LDFLAGS := -Wl,-dead_strip
else
    LDFLAGS := -Wl,--gc-sections -lpthread -ldl
endif

all: target/double
    target/double

target:
    mkdir -p $@

target/double: target/main.o target/debug/libdouble_input.a
    $(CC) -o $@ $^ $(LDFLAGS)

target/debug/libdouble_input.a: src/lib.rs Cargo.toml
    cargo build

target/main.o: src/main.c | target
    $(CC) -o $@ -c $<

clean:
    rm -rf target
请告诉我为什么这是执行令?txs^^^。
让我困惑的是为什么第一步是
mkdir-p target

您的目标是
全部
<代码>所有取决于必须首先完成的目标/双。依次取决于
target/main.o
target/debug/libdouble\u input.a
。因此,必须首先执行
target/main.o
target/debug/libdouble\u input.a
。在这里,您很幸运(稍后我们将了解原因):make首先尝试构建
target/main.o
。由于
target/main.o
target
作为一个先决条件,因此必须首先执行
target
,并且必须执行。Qed

注意:
target
target/main.o
的纯订单先决条件,而不是常规先决条件(《代码》|符号启动纯订单先决条件列表)。这意味着make只关注它的存在。它忽略了最后一次修改时间,这很好,因为目录的最后一次修改时间通常与构建过程无关

为什么
target
target/main.o
的先决条件?因为如果
target
目录尚不存在,则无法生成
target/main.o
。构建将完全失败。因此,order only先决条件告诉make目录必须首先存在

你为什么这么幸运?因为如果make尝试先生成
target/debug/libdouble\u input.a
,并且如果
cargo build
没有创建目标目录,那么它就会失败。即使您知道
target/main.o
是首先构建的,因为它是
target/double
的第一个先决条件,您也不应该指望它。总有一天,有人会尝试使用并行make(
make-j
),事情可能会出错。此外,
target
可以存在,但不能
target/debug

注意:即使您知道,
cargo build
负责创建目标目录,也可能明智的做法是在Makefile中添加一个仅限订单的prerquisite。以防某天发生变化。并向Makefile的读者展示您知道在这里做什么:

target target/debug:
    mkdir -p $@

target/debug/libdouble_input.a: src/lib.rs Cargo.toml | target/debug
    cargo build

这没什么大不了的,可以帮你避免一些错误。

哦!你为我提供了这么多!!txs。。。。。。。非常非常!!
target target/debug:
    mkdir -p $@

target/debug/libdouble_input.a: src/lib.rs Cargo.toml | target/debug
    cargo build