为什么gcc讨厌我简单的makefile?

时间:2011-10-14 22:15:49

标签: c gcc makefile flex-lexer

我有以下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文件,则这是正常响应。但是,当需要创建这些文件时,为什么不能“工作”。

注意:我已将Tabs放在makefile中。 flex是一个基于blah.lex

的内容生成lex.yy.c的工具

1 个答案:

答案 0 :(得分:10)

如果您直接从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,即UTF-8编码对于U + 2013,en-dash。