24

在makefile中,即使没有定义CC ${CC} -o myfile myfile.c,两者都可以正常工作。$(CC) -o myfile myfile.c我的问题是:

  1. 如何使用$(..)${..}
  • 如果未定义该字符串,他们是否只是将字符串转换为{}小写?()
  • 为什么需要$${dir}两个$$
    for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done
  1. ${}和之间有什么区别$()吗?
4

2 回答 2

36

()Make之间没有区别{}

如果您$$在配方中使用,则$“转义”并传递给外壳。$()然后外壳可能会在或之间产生差异${}。但这完全取决于外壳,与 Make 或 makefile 无关。

在您引用的配方命令中

for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done

制作这样做:

  • 替换 , 的值DIR,${DIR}也可以是$(DIR)
  • 替换$$$(“转义”,以便$可以传递给外壳)
  • MAKE替换为的值${MAKE},这也可能是$(MAKE). 的值MAKE由 Make 自动设置为正在使用的 make 可执行文件。
  • 将生成的字符串传递给 shell 执行 - 然后 shell${}按照它想要的方式解释剩余的字符串。

CC, 与 Make 默认预定义的变量之一类似MAKE,这就是即使您自己不设置它也能“工作”的原因。

顺便说一句,为“目标”编写此配方的更好方法是

.PHONY: $(DIR)
target: $(DIR)
$(DIR):
    $(MAKE) -C $@

请查阅手册以了解不清楚的内容。

于 2013-10-20T10:16:44.443 回答
-2
$(CC) - 是评估;这可以是一个命令

VS

${CC} - 取消引用;只需获取变量的值

于 2013-10-20T08:18:34.523 回答