【问题标题】:Why does this makefile work with make 3.81 but not 3.82?为什么这个 makefile 可以使用 make 3.81 而不是 3.82?
【发布时间】:2014-01-05 23:05:44
【问题描述】:

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

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

这是我的生成文件:

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)'.

什么给了?请帮忙!谢谢!

【问题讨论】:

    标签: c++ makefile


    【解决方案1】:

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

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

    【讨论】:

    • 是的,看起来就是这样,我不知道为什么。使用您的建议没有任何效果。 3.81 寻找目标文件 libname.a(file1.o) 而 3.82 尝试 file1.o)!对我来说毫无意义。
    • 顺便说一句,这直接来自 GNU make 手册。 11.2 Implicit Rule for Archive Member Targets
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2020-10-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多