为什么在makefile结束时使用+ =无法正常工作但在开始时可以做什么?

时间:2014-01-23 03:32:11

标签: c++ makefile

enter image description here

我在makefile中使用了+ =并尝试添加更多编译文件:

使左侧文件正常工作:编译4 .cpp文件。

但是使正确的文件无法正常工作,它只编译main.o和xmlutil.o。 因此,echomsg中的echo $(OBJS)可以打印4 .o。

那么根本原因是什么?

1 个答案:

答案 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 =右侧