Makefile Hell - нуб с ошибкой - PullRequest
       4

Makefile Hell - нуб с ошибкой

0 голосов
/ 22 августа 2011

Видимо, эта ошибка:

makefile:4: *** missing separator.  Stop.

является результатом неиспользования вкладок при вызове команд компилятора внутри make-файлов. Вот проблема:

main.o : main.cpp mylib.h
    g++ -c main.cpp

У меня уже есть вкладка. Тем не менее, я все еще получаю эту ошибку.

Что я делаю не так?

Выход Hexdump:

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

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Расшифровывая ваш шестнадцатеричный дамп, мы обнаруживаем, что в начале строки компилятора вместо табуляции есть 4 пробела.

0000050 6d20 6c79 6269 682e 200a 2020 6720 2b2b
                            ^^   ^^^^   ^^

Четыре шестнадцатеричных числа 20 здесь являются ориентировочными.Полный make-файл:

#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

Командные строки в make-файле должны начинаться с явной вкладки.(Это одна из основных ошибок с make-файлами. У меня до сих пор не было хорошего объяснения того, почему вместо разрешения пробелов что-то может сломаться, но история говорит, что проблема была обнаружена очень рано в истории make, но это не моглоне может быть исправлено из-за существующей кодовой базы. И я до сих пор не понимаю, как изменение разрешающих пробелов, а также табуляции в начале командной строки могло бы что-то сломать.)

Чтобы исправить, повернитеВыключите режим «развернуть вкладки» в vim:

:set noet

и убедитесь, что в начале строки действительно есть вкладка.Или убедитесь, что vim чувствителен к синтаксису (поэтому он не заменяет табуляции пробелами в make-файлах).


Обратите внимание, что комментарий "выше ..." ошибочен.Вы ничего не говорите о lab1.out в этом make-файле и ничего не говорите о mylib.o.Мы предполагаем, что это потому, что ваш полный make-файл упоминает об этом, и вы подрезали свой make-файл, чтобы воспроизвести проблему, но не обрезали его в максимально возможной степени.

Также стоит научиться использовать макросывстроенный в make;на самом деле, лучше не указывать команду, потому что make знает, как создать файл .o из файла .cpp.Вы могли бы просто написать:

main.o: mylib.h
0 голосов
/ 22 августа 2011

Я думаю, что ваш make-файл, вероятно, находится в другой кодировке, может быть, UTF8 или что-то в этом роде.Я поместил текст в конвертер hex в 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
...