Undefined Ссылка на yywrap
У меня есть простой "язык", который я использую Flex (Lexical Analyzer), он выглядит следующим образом:
/* Just like UNIX wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n { chars++; lines++; }
. { chars++; }
%%
int main()
{
yylex();
printf("%8d%8d%8d\n", lines, words, chars);
}
Я запускаю flex count.l
, все идет нормально без ошибок или предупреждений, затем, когда я пытаюсь сделать cc lex.yy.c
, я получил следующие ошибки:
ubuntu @eeepc: ~/Рабочий стол $cc lex.yy.c
/tmp/ccwwkhvq.o: В функции yylex':
lex.yy.c:(.text+0x402): undefined reference to
yywrap '
/tmp/ccwwkhvq.o: В функции input':
lex.yy.c:(.text+0xe25): undefined reference to
yywrap '
collect2: ld возвращен 1 статус выхода
Что не так?
Ответы
Ответ 1
Сканер вызывает эту функцию в конце файла, поэтому вы можете указать ему другой файл и продолжить сканирование его содержимого. Если вам это не нужно, используйте
%option noyywrap
Хотя отключение yywrap
, безусловно, является наилучшим вариантом, также возможно связать с -lfl
использование функции yywrap()
по умолчанию в библиотеке fl
(то есть libfl.a
), предоставляемой flex. Posix требует, чтобы библиотека была доступна с флагом компоновщика -ll
и в установленной по умолчанию установке OS X -ll
только это имя.
Ответ 2
Я предпочитаю определять свой собственный yywrap(). Я компилирую с С++, но точка должна быть очевидной. Если кто-то вызывает компилятор с несколькими исходными файлами, я храню их в списке или массиве, а затем yywrap() вызывается в конце каждого файла, чтобы дать вам возможность продолжить новый файл.
int yywrap() {
// open next reference or source file and start scanning
if((yyin = compiler->getNextFile()) != NULL) {
line = 0; // reset line counter for next source file
return 0;
}
return 1;
}
Ответ 3
flex не всегда устанавливается вместе со своими библиотеками разработки (что странно, так как это инструмент разработки). Установите библиотеки, и жизнь станет лучше.
На базовых системах Redhat:
yum -y install flex-devel
./configure && make
В системах на основе Debian
sudo apt-get install libfl-dev
Ответ 4
В качестве примечания для последователей Flex 2.6.3 имеет ошибку, в которой libfl.a "обычно будет" определять yywrap, но затем не в определенных случаях, поэтому проверьте, может ли ваша версия flex быть связана с вашей проблемой:
https://github.com/westes/flex/issues/154