c - makefile 的所有部分中的变量和函数在读取时都会展开

标签 c makefile

GNU make教程中说:

Variables and functions in all parts of a makefile are expanded when read, except for in recipes, the right-hand sides of variable definitions using ‘=’, and the bodies of variable definitions using the define directive.

我编写了以下 make:

CC:=gcc
$(CC)G=-o
TARGET=fmake
fmake: $(TARGET).c
    $(CC) $(gccG) $(TARGET) $(TARGET).c 

尽管我在变量定义的右侧使用“=”并在配方中使用了 varibale,但它正确编译了我的 .c 源文件。

最佳答案

如果交换前两行的顺序,也许会更容易解释会发生什么:

$(CC)G=-o
CC:=gcc

在第一行中,变量$(CC)出现在左侧,因此在读取时立即展开;但您尚未定义该变量,因此它会扩展为空白,最终结果就像您键入了 G=-o 一样。然后当需要扩展 $(gccG) 时,没有该名称的变量,因此也变成空白;因此实际执行的命令是 gcc fmake fmake.c(注意没有标志)。

这种延迟扩展意味着这样的事情:

VAR=$(VAR2)

在读取 $(VAR2) 时不会立即展开;存储的内容是$(VAR2)。 VAR2 可以稍后更改,然后当 VAR 扩展时,它扩展为 $(VAR2),$(VAR2) 本身也扩展为其新值。

关于c - makefile 的所有部分中的变量和函数在读取时都会展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20929696/

相关文章:

android - 为 Android 构建 OpenJPEG

c - 使用 EVP 接口(interface)的 AES-GCM 的 OpenSSL C 示例

c - 未定义对 `initscr' Ncurses 的引用

makefile - GNU 制作 : build all sources in a different directory

makefile - .deps/*.Po : No such file or directory compiler error

c++ - 在 xcode 中编译和链接 OpenCV 3.0.0 时遇到问题

c - 使用 doxygen 记录配置宏

c - scanf 内存分配错误

c - 尝试使用结构从数组访问菜单名称...出现错误

一主两从的正确makefile