Почему gcc ненавидит мой простой makefile?

#c #gcc #makefile #flex-lexer

#c #gcc #makefile #flex-lexer

Вопрос:

У меня есть следующий makefile, который gcc не нравится:

 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. Но почему «make» не работает, когда эти файлы необходимо создать.

Примечание: я поместил вкладки в makefile. flex — это инструмент, который генерирует lex.yy.c на основе содержимого blah.lex

Комментарии:

1. Должно быть, это какая-то проблема с кодировкой символов Makefile. Попробуйте использовать любой редактор, который позволяет отображать реальные символы, например, vi или notepad .

2. Я использовал notepad для создания makefile

Ответ №1:

Если вы скопировали текст непосредственно из Makefile , вот ваша проблема:

Вместо простого тире (ASCII 45, Unicode U 002D) у вас есть тире (cp1252 0x96, Unicode U 2013) в строках gcc -o ... и gcc -c ... . Замените их простыми тире.

Чтобы узнать, удалось ли вам, используйте следующую команду:

 cat Makefile | tr -d 'rnt -~' | hexdump -C
  

Это извлечет все «странные» байты из Makefile и распечатает их вам в шестнадцатеричном дампе. В идеале вывод этой команды должен быть таким:

 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 .

Комментарии:

1. О, люблю кодировки Windows … 🙂

2. Быстрый взгляд на de.wikipedia.org/wiki/Codepage_850 подтвердилось это подозрение. Makefile закодирован в CP1252, а окно консоли использует кодовую страницу 850, в которой число 0x96 представляет собой û именно тот символ, который вы опубликовали.

3. Большое спасибо. Проблема заключалась в тире. Когда я создавал makefile, я скопировал и вставил пример makefile из документа Word, в котором были неправильные тире.

4. Вам также нужно следить за символами табуляции. Для Makefile требуются фактические символы табуляции (ASCII HT, t ); пробелы не подойдут. Копирование и вставка могут увеличить табуляцию до пробелов, если вы не будете осторожны. (Это может зависеть от того, какую версию make вы используете.)