在嵌入式项目中,您通常使用 objcopy 将 GCC 的 ELF 输出转换为原始二进制形式。我尝试为此编写一个模式规则: %.bin: %
(gcc 的可执行输出没有后缀,至少在 Linux 上是这样)。失败,并显示 make: *** Norule to make target ...
这是一个完整的测试用例:
测试.c:
int main(int argc, char *argv[]) {
return 0;
}
生成文件:
%.bin: %
objcopy -O binary $< $@
这通过说 make test test.bin
来工作,也就是说,通过明确要求它首先构建 test
可执行文件。说make test.bin
是行不通的。不知何故,在这种情况下,make 没有意识到它可以使用内置规则来创建先决条件。
我知道我可以通过将规则编写为 test.bin: test
来解决此问题,但我想知道为什么此模式规则不起作用以及我能否让它以某种方式起作用。
此外,我认为让它发挥作用的明显而实用的方法打破了漂亮而优雅的内置规则系统。如果我可以选择例如,它可以被拯救LDFLAGS 使链接器输出带有某些后缀的可执行文件,例如.elf
(我还需要重写内置的链接规则吗?哦,好吧...)。
我承认,这纯粹是迂腐思想中产生的学术问题。
最佳答案
你的想法是正确的,但是你遇到了 make 的警告 -- make 不会将纯 %
目标与其他隐式规则链接起来 --
https://www.gnu.org/software/make/manual/html_node/Chained-Rules.html#Chained-Rules
... for performance reasons make will not consider non-terminal match-anything rules (i.e., ‘%:’) when searching for a rule to build a prerequisite of an implicit rule (see Match-Anything Rules).
关于Makefile:如何编写有先决条件而没有后缀的模式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67969001/