我有以下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的工具答案 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。