【问题标题】:Why does gcc hate my simple makefile?为什么 gcc 讨厌我的简单 makefile?
【发布时间】:2011-10-14 22:15:48
【问题描述】:

我有以下 gcc 不喜欢的 makefile:

blah.exe:lex.yy.o
    gcc –o blah.exe lex.yy.o
lex.yy.o:lex.yy.c
    gcc  –c lex.yy.c
lex.yy.c:blah.lex
    flex blah.lex

如果我删除了除原始 blah.lex 文件之外的所有内容,则在运行 make 时会出现此错误:

flex blah.lex
gcc  ûc lex.yy.c
gcc: ûc: No such file or directory
make: *** [lex.yy.o] Error 1

现在,如果我按此顺序执行以下命令,则一切正常并可以编译。

flex blah.lex    
gcc  –c lex.yy.c
gcc –o blah.exe lex.yy.o

接下来,如果我运行 make,它会说:

make: `blah.exe' is up to date.

如果存在 *.o 和 *.exe 文件,这是正常响应。但是为什么在需要创建这些文件时不能“制作”工作。

注意:我已经在 makefile 中添加了 Tabs。 flex是一个根据blah.lex的内容生成lex.yy.c的工具

【问题讨论】:

  • 这肯定是Makefile的字符编码有问题。尝试使用任何允许您显示实际字符的编辑器,例如 vi 或 notepad++。
  • 我使用notepad++来创建makefile

标签: c gcc makefile flex-lexer


【解决方案1】:

如果您直接从Makefile 复制文本,这就是您的问题:

gcc -o ...gcc -c ... 行中有一个短划线(cp1252 0x96,Unicode U+2013),而不是简单的破折号(ASCII 45,Unicode U+002D)。用简单的破折号替换它们。

要查看是否成功,请使用以下命令:

cat Makefile | tr -d '\r\n\t -~' | hexdump -C

这将从 Makefile 中提取所有“奇怪的”字节,并在 hexdump 中将它们打印给您。理想情况下,该命令的输出应该是这样的:

00000000

在您的情况下,输出可能是:

00000000  ef bb bf e2 80 93 e2 80  93                       |.........|
00000009

这意味着该文件是 UTF-8 编码的(前三个字节告诉你),其中还有另外两个 UTF-8 字符:两次 e2 80 93,这是 U 的 UTF-8 编码+2013,破折号。

【讨论】:

  • 哦。喜欢 Windows 编码... :)
  • 快速浏览de.wikipedia.org/wiki/Codepage_850 证实了这种怀疑。 Makefile 以 CP1252 编码,控制台窗口使用 Codepage 850,其中数字 0x96 代表 û,正是您发布的字符。
  • 非常感谢。破折号是问题所在。当我创建 makefile 时,我从 Word 文档中复制并粘贴了一个 makefile 示例,其中包含错误类型的破折号。
  • 您还需要注意制表符。 Makefile 需要实际的制表符(ASCII HT,\t)字符;空格不行。如果您不小心,复制和粘贴可能会将制表符扩展到空格。 (这可能取决于您使用的 make 的版本。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2010-09-05
  • 2011-05-20
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多