#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
вы используете.)