Makefile地狱-一个有错误的noob

Makefile地狱-一个有错误的noob,makefile,gnu-make,Makefile,Gnu Make,显然,这个错误: makefile:4: *** missing separator. Stop. 是在makefiles中调用编译器命令时不使用选项卡的结果。问题是: main.o : main.cpp mylib.h g++ -c main.cpp 我已经有账单了。然而,我仍然得到这个错误 我做错了什么 hextump输出: 0000000 6c23 6261 2e31 616d 656b 2d20 202d 6874 0000010 7369 6920 2073 2061 6

显然,这个错误:

makefile:4: *** missing separator.  Stop.
是在makefiles中调用编译器命令时不使用选项卡的结果。问题是:

main.o : main.cpp mylib.h
    g++ -c main.cpp
我已经有账单了。然而,我仍然得到这个错误

我做错了什么

hextump输出:

0000000 6c23 6261 2e31 616d 656b 2d20 202d 6874
0000010 7369 6920 2073 2061 6f63 6d6d 6e65 2074
0000020 696c 656e 202c 6769 6f6e 6572 2064 7962
0000030 6d20 6b61 2065 7475 6c69 7469 0a79 6d0a
0000040 6961 2e6e 206f 203a 616d 6e69 632e 7070
0000050 6d20 6c79 6269 682e 200a 2020 6720 2b2b
0000060 2d20 2063 616d 6e69 632e 7070 230a 6261
0000070 766f 2c65 7720 2065 7261 2065 6173 6979
0000080 676e 7420 6168 2074 616c 3162 6f2e 7475
0000090 6420 7065 6e65 7364 6f20 206e 616d 6e69
00000a0 2e31 2c6f 6120 646e 6d20 6c79 6269 6f2e
00000b0 202e 230a 6f74 6320 6572 7461 2065 616c
00000c0 3162 6f2e 7475 202c 6874 2065 2b67 202b
00000d0 6f63 6d6d 6e61 2064 6873 776f 206e 6e6f
00000e0 7420 6568 6e20 7865 2074 696c 656e 6920
00000f0 2073 6967 6576 0a0a                    
00000f8

我认为您的makefile可能采用了不同的编码,可能是UTF8或其他编码。 我把文本放入一个十六进制到ascii的转换器,这就是结果

l#ba.1amek-  -htsii  s aocmmne tilen ,gioner dybm ka etuliti
ym
ia.n o :amnic.ppm lybih. 
  g ++-  camnic.pp#
bavo,ew  era easiygnt ah tal1bo.tud penesdo  namni.1,oa dnm lybio. .#
otc erta eal1bo.tu ,ht e+g +ocmmna dhswo nnot ehn xe tileni  sigev

解码十六进制转储时,我们发现编译器行的开头有4个空格,而不是一个制表符

0000050 6d20 6c79 6269 682e 200a 2020 6720 2b2b
                            ^^   ^^^^   ^^
其中的四个十六进制20是指示性的。 完整的makefile是:

#lab1.make -- this is a comment line, ignored by make utility

main.o : main.cpp mylib.h
    g++ -c main.cpp
#above, we are saying that lab1.out depends on main1.o, and mylib.o. 
#to create lab1.out, the g++ command shown on the next line is give
makefile中的命令行必须以显式选项卡开头。(这是makefiles的主要问题之一。我仍然没有很好的解释为什么允许使用空格会破坏任何东西,但历史表明,这个问题很早就在
make
的历史中发现了,但由于现有的代码库,它无法修复。我仍然不明白如何更改如果在命令行的开头允许空格和制表符,将破坏一切。)

要修复此问题,请在
vim
中关闭“展开选项卡”模式:

:set noet
并确保该行的开头确实包含一个实际的制表符。 或者确保
vim
对语法敏感(因此它不会在makefiles中用空格替换制表符)


请注意,“上述…”评论是错误的。在这个makefile中,您没有提到
lab1.out
,也没有提到
mylib.o
。我们假设这是因为您的完整makefile确实提到了这些,并且您对makefile进行了修剪以重现问题,但没有尽可能地对其进行修剪

还值得学习如何使用
make
中内置的宏;实际上,最好不要指定命令,因为
make
知道如何从
.cpp
文件创建
.o
文件。你可以简单地写下:

main.o: mylib.h

是什么让你如此确信你有一张账单(而没有别的)?检查生成文件的十六进制转储。制表符的十六进制代码是什么?如果这有什么意义的话,我也在用vim写这篇文章。但至于回答你的问题,我是肯定的,因为我尝试了整个事情的退格,双标签,等等,但没有发现任何有效的方法。我只有一个标签。嗯,
hextump-C
更容易解释。但是选项卡是
09
,并且您的转储中没有这些选项卡。默认的选项卡空间量是多少?4个空间?5个空间?如果是这样,我可以不使用制表符就复制它吗?
make
特别需要制表符。它不适用于任何数量的空间。(如果您无法让vim生成制表符,请使用vim标记提问,以吸引能够帮助您的人)。这只是因为hexdump显示的是一系列小的endian 16位值,而不是一系列8位字节。每秒钟交换一个字符,就可以找到普通的ASCII内容。(因为没有高位字节,所以在本例中UTF-8与ASCII相同)。