Référence indéfinie à yywrap
J'ai un "langage" simple que j'utilise Flex (analyseur Lexical), c'est comme ceci:
/* 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%8dn", lines, words, chars);
}
Le je lance un flex count.l
, tout va bien sans erreurs ou avertissements, puis quand j'essaie de faire un cc lex.yy.c
j'ai eu ces erreurs:
Ubuntu@eeepc: ~ / Desktop $ cc lex.aa.c
/ tmp / ccwwkhvq.o: en fonctionyylex': lex.yy.c:(.text+0x402): undefined reference to
yywrap '
/ tmp / ccwwkhvq.o: en fonctioninput': lex.yy.c:(.text+0xe25): undefined reference to
yywrap '
collect2: ld a renvoyé 1 statut de sortie
Qu'est-ce qui ne va pas?
4 réponses
Le scanner appelle cette fonction à la fin du fichier, de sorte que vous pouvez le pointer vers un autre fichier et continuer à analyser son contenu. Si vous n'en avez pas besoin, utilisez
%option noyywrap
Bien que la désactivation de yywrap
soit certainement la meilleure option, il peut également être possible de créer un lien avec -lfl
pour utiliser la fonction yywrap()
par défaut dans la bibliothèque fl
(c'est-à-dire libfl.a
) fournie par flex. Posix exige que cette bibliothèque soit disponible avec l'indicateur d'éditeur de liens -ll
et L'installation par défaut D'OS X ne fournit que ce nom.
Je préfère définir mon propre yywrap (). Je compile avec C++, mais le point devrait être évident. Si quelqu'un appelle le compilateur avec plusieurs fichiers sources, je les stocke dans une liste ou un tableau, et ensuite yywrap() est appelée à la fin de chaque fichier pour vous donner une chance de continuer avec un nouveau fichier.
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;
}
Flex ne s'installe pas toujours avec ses bibliothèques de développement (ce qui est étrange, car c'est un outil de développement). Installez les bibliothèques, et la vie est meilleure:
yum -y install flex-devel
./configure && make
Comme une note pour les adeptes, flex 2.6.3 a un bug où libfl.un" typiquement " définirait yywrap mais ne le fait pas dans certains cas, alors vérifiez si c'est votre version de flex, peut être lié à votre problème: