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

Mat*_*t G 6 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
Run Code Online (Sandbox Code Playgroud)

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

flex blah.lex
gcc  ûc lex.yy.c
gcc: ûc: No such file or directory
make: *** [lex.yy.o] Error 1
Run Code Online (Sandbox Code Playgroud)

现在,如果按此顺序执行以下命令,则所有操作都可以正常运行并进行编译.

flex blah.lex    
gcc  –c lex.yy.c
gcc –o blah.exe lex.yy.o
Run Code Online (Sandbox Code Playgroud)

在此之后,如果我运行make,它会说:

make: `blah.exe' is up to date.
Run Code Online (Sandbox Code Playgroud)

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

注意:我已将选项卡放在makefile中.flex是一个基于blah.lex内容生成lex.yy.c的工具

Rol*_*lig 10

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

而不是简单的破折号(ASCII 45,Unicode的U + 002D),你必须在一个短破折号(CP1252 0x96,Unicode的U + 2013)gcc -o ...gcc -c ...线.用简单的破折号替换它们.

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

cat Makefile | tr -d '\r\n\t -~' | hexdump -C
Run Code Online (Sandbox Code Playgroud)

这将从Makefile中提取所有"怪异"字节,并在hexdump中将它们打印到您的身上.理想情况下,此命令的输出应为:

00000000
Run Code Online (Sandbox Code Playgroud)

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

00000000  ef bb bf e2 80 93 e2 80  93                       |.........|
00000009
Run Code Online (Sandbox Code Playgroud)

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

  • 您还需要注意制表符.Makefile需要实际的tab(ASCII HT,`\ t`)字符; 空间不会.如果您不小心,复制粘贴可能会将标签扩展到空格.(这可能取决于你正在使用的`make`的版本.) (2认同)