gpt4 book ai didi

c - Makefile 中的自动变量未正确扩展

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:16 28 4
gpt4 key购买 nike

我正在使用以下代码:

HELLO_WORLD=hello

$(HELLO_WORLD): $(addsuffix .c,$@)
gcc $< -o $@

但是,当我运行代码时,我收到以下错误,暗示 $< 未计算任何值:

gcc  -o hello
gcc: fatal error: no input files

当我使用下面的代码时...

HELLO_WORLD=hello

$(HELLO_WORLD): $(addsuffix .c,$@)
gcc $(addsuffix .c,$@) -o $@

...Makefile 计算出以下命令...

gcc hello.c -o hello

...这正是我想要的。但是,我不想使用 addsuffix 两次。如果更改先决条件,我想使用 $<。我该怎么做呢?

最佳答案

问题不在于 $< 的扩展在食谱中。问题是 $@ 的扩展在先决条件列表中。

自动变量,例如$@ , 只在配方中定义,不在目标或先决条件列表中。这在 GNU Make manual section on automatic variables 中突出显示:

A common mistake is attempting to use $@ within the prerequisites list; this will not work.

事实hello.c实际上不在先决条件列表中不会阻止您调用 make hello .这只是意味着 make hello将始终调用编译器,即使 hello.c没有被修改。但它确实意味着 $<将与计算出的先决条件列表一样空。

GNU make 确实有一个特性可以让你对先决条件进行二次扩展;这在手册中有解释。但更简单的解决方案是根本不依赖 $@在先决条件列表中。如果您尝试创建自己的通用 C 编译配方,请使用目标文件 ( .o) 目标的模式规则。对于最终的可执行文件,列出最终可执行文件的所有先决条件(几乎肯定会有多个文件)。

通常这是使用名称类似于 SRCS 的单独变量来完成的和 OBJS (或者 SOURCESOBJECTS 如果你不介意输入元音)。通常,您将目标文件作为最终可执行文件的先决条件(这将是一个链接操作),因为每个单独的源文件都有其自己的 header 先决条件。

关于c - Makefile 中的自动变量未正确扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56064983/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com