2009-09-26 7 views
8

J'essaie d'utiliser flex et bison pour créer un langage de script simple. En ce moment, j'essaie juste de faire fonctionner une calculatrice.Référence non définie à 'yylex()'

Je ne peux pas le compiler, cependant. Quand je lance ce makefile:

OBJECTS = hug.tab.o hug.yy.o 
PROGRAM = hug.exe 

CPP = g++ 
LEX = flex 
YACC = bison 

.PHONY: all clean 

all: $(OBJECTS) 
$(CPP) $^ -o $(PROGRAM) 

clean: 
$(RM) *.o *.output *.tab.* *.yy.* $(PROGRAM) 

%.tab.o: %.tab.cpp 
$(CPP) -c -o [email protected] $< 

%.tab.cpp: %.ypp 
$(YACC) -vd $< 

%.yy.o: %.yy.c 
$(CPP) -c -o [email protected] $< 

%.yy.c: %.l 
$(LEX) -o [email protected] $< 

%.o: %.cpp 
$(CPP) -c -o [email protected] $< 

sur mes .L et les fichiers .ypp, je reçois cette erreur:

undefined reference to `yylex()' 

Et si je fais la commande pour all comme ceci:

$(CPP) $^ -o $(PROGRAM) -lfl 

il dit qu'il n'a pas pu trouver -lfl. Et si je fais comme ceci:

$(CPP) $^ -o -lfl $(PROGRAM) 

il remonte à l'erreur undefined reference. Désolé, je suis un peu ignorant à ce sujet.

EDIT: J'ai installé flex. J'ai essayé de le changer de -lfl à C: /GnuWin32/lib/libfl.a (J'essaie d'utiliser Windows parce que Linux a des problèmes bizarres sur mes ordinateurs et je n'ai pas encore de Mac), mais il a toujours le même erreur.

+1

C++ Vous devez lire la documentation pour le C/C++ compilateur que vous utilisez. "-o" est une option qui produit un fichier de sortie; l'argument suivant doit spécifier le nom de ce fichier. "-l" spécifie une bibliothèque; La documentation vous indiquera la convention de nommage et l'emplacement où le compilateur recherchera cette bibliothèque. En guise d'estimation, vous n'avez pas installé la bibliothèque Flex. – kdgregory

+0

Je reçois le même problème. Mon programme compile avec gcc, problème avec la version g ++. – Dilawar

Répondre

1

avez-vous installé la bibliothèque flex? Si oui, essayez quelque chose comme

$(CPP) $^ /path/of/flex/lib/libfl.a -o $(PROGRAM) 
+0

Je l'ai installé. J'ai essayé de le changer de -lfl à C: /GnuWin32/lib/libfl.a (J'essaie d'utiliser Windows parce que Linux a des problèmes bizarres sur mes ordinateurs et je n'ai pas encore de Mac), mais il a toujours le même erreur. – Micah

0

J'ai ajouté mon fichier avec ceci.

main() 
{ 
    return (yylex()) 

} 

Maintenant, il me donne une erreur de segmentation mais je peux l'obtenir lié.

10

Le problème est que vous compilez hug.yy.c avec g ++ (en le traitant comme C++) au lieu de gcc. C'est le fichier qui définit yylex, donc en le compilant en C++ vous finissez avec une fonction yylex C++ tandis que les autres fichiers recherchent une fonction C yylex.

essayez de coller extern "C" int yylex(); dans la première section de votre fichier hug.l afin qu'il utilisera la liaison C pour yylex au lieu de

Questions connexes