为什么这个makefile适用于make 3.81而不是3.82?

时间:2013-12-17 23:30:20

标签: c++ makefile

我有一个非常简单的makefile来构建一个静态库,它在GNU make 3.81版本中运行良好多年,但在版本3.82时失败了。

我已经阅读了有关向后兼容性的问题,但这些问题似乎并不适用。我还在这里检查了几个帖子,例如Makefile Syntax: Static library lib$(library).a($objects)Makefile - to create a static library,但无法找到解决方案。

这是我的makefile:

FILES = file1.cc file2.cc file3.cc

OBJ_FILES = $(FILES:.cc=.o)

libname.a: libname.a($(OBJ_FILES))

在版本3.81下,使用内置和隐式规则进行编译。 样本输出

g++  -c -o file1.o file1.cc
ar rv libname.a file1.o
ar: creating libname.a
a - file1.o

但是版本3.82失败并带有

*** No rule to make target `file1.o)'

我查看了make -d的输出,而版本3.82的输出失败了

   No implicit rule found for `file1.o)'.
   Finished prerequisites of target file `file1.o)'.
  Must remake target `file1.o)'.
make: *** No rule to make target `file1.o)', needed by `libname'.  Stop.

虽然版本3.81继续顺利

Trying implicit prerequisite `file1.o'.
Looking for a rule with intermediate file `file1.o'.
 <snip>
Found an implicit rule for `libname.a(file1.o)'.

是什么给出的?请帮忙!谢谢!

1 个答案:

答案 0 :(得分:0)

file1.o)':看起来它在某种程度上包含了文件名/字符串中的右括号“)”。

尝试明确列出目标文件,例如OBJ_FILES = file1.o file2. file3.o,或使用其他方式将.cc替换为.o