【问题标题】:What does "$(@:%.o=%.d)" mean in a makefile?“$(@:%.o=%.d)”在生成文件中是什么意思?
【发布时间】:2016-11-08 06:33:41
【问题描述】:

我在 makefile 中看到以下 GCC 的命令选项:

... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)"  -o "$@" "$<"

如何解读?

我搜索了makefile文档,但到目前为止没有运气。

(这不仅仅是关于Automatic Variables

【问题讨论】:

标签: makefile gnu-make


【解决方案1】:

$(:=) 执行 string replacement
$@the name of the file being generated(目标)。
所以$(@:%.o=%.d)是文件名,.o扩展名改为.d

此命令行为每个.o 文件生成一个.d 依赖文件。

【讨论】:

  • 我从没想过() 可以与$@ 交错。
  • @smwikipedia Make 没有最漂亮的语法,我给你:p
【解决方案2】:

(感谢@Quentin 的提示。我刚刚找到了!)

Substitution Reference

引用:

替换引用将变量的值替换为 您指定的更改。它的格式为“$(var:a=b)”(或 ‘${var:a=b}’),其含义是取变量的值 var,将单词末尾的每个 a 替换为该值中的 b,并且 替换结果字符串。

当我们说“在词尾”时,我们的意思是必须出现 后跟空格或值的末尾,以便 更换;值中出现的其他 a 保持不变。为了 示例:

foo := a.o b.o c.o

bar := $(foo:.o=.c)

将“bar”设置为“a.c b.c c.c”。见Setting Variables

替代引用实际上是使用的缩写 patsubst 扩展功能(见Functions for String Substitution and Analysis)。我们提供替代参考以及 patsubst 与 make 的其他实现兼容。

所以,以下命令的完整解释:

... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)"  -o "$@" "$<"

是:

使用 gcc 编译第一个必备文件 ($&lt;) 并生成 以当前规则目标的名称命名的输出文件 (%@)。并且通过 这样,生成一个名为*.d 的makefile,其中包含一个rule 来描述当前规则目标的依赖关系。并更改 rule 目标的名称 生成从*.o*.d*.d makefile。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2020-06-26
    • 1970-01-01
    • 2011-10-22
    • 2010-12-26
    • 2010-10-24
    • 2019-12-05
    相关资源
    最近更新 更多