关于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