我在makefile中使用了+ =并尝试添加更多编译文件:
使左侧文件正常工作:编译4 .cpp文件。
但是使正确的文件无法正常工作,它只编译main.o和xmlutil.o。 因此,echomsg中的echo $(OBJS)可以打印4 .o。
那么根本原因是什么?
答案 0 :(得分:1)
当make
读取makefile
时,它会扩展规则行的RHS * (${OBJS}
等行中的${TARGET}: ${OBJS}
${OBJS}
的当前值。当在命令中使用宏时,它会在执行命令时展开,因此echo ${OBJS}
从文件末尾获取值,因为它在读取整个文件之后才会展开。
在“宏”部分中为POSIX make
指定了此行为:
宏
...
宏可以出现在makefile中的任何位置。使用
$(string1)
或${string1}
表单的宏扩展应替换为string2
,如下所示:
读取目标行时,应评估目标行中的宏。
执行命令时,应评估
makefile
命令行中的宏。在进行宏分配时,应评估宏定义中
<equals-sign>
之前的字符串中的宏。在定义的宏用于规则或命令之前,或者在宏定义中的
<equals-sign>
之前,不应评估宏定义中<equals-sign>
之后的宏。
第一颗子弹定义了我所说的行为。
规范前面有一个有趣的评论(在'Makefile syntax'下)
也可以多次定义宏,并在宏中指定宏的值。
* RHS =右侧