2009-09-26 37 views
8

Estoy tratando de usar flex y bison para crear un lenguaje de scripting simple. En este momento, solo estoy tratando de hacer funcionar una calculadora.Referencia no definida a 'yylex()'

No puedo hacer que compile, sin embargo. Cuando ejecuto este 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] $< 

en mis archivos y .L .ypp, me sale este error:

undefined reference to `yylex()' 

Y si hago el comando para all así:

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

dice que no pudo encontrar -lfl. Y si lo hago de esta manera:

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

que se remonta al error undefined reference.

Lo siento, no tengo ni idea de esto.

EDITAR: Tengo Flex instalado. Traté de cambiarlo de -lfl a C: /GnuWin32/lib/libfl.a (estoy tratando de usar Windows porque Linux tiene problemas extraños en mis computadoras y aún no tengo una Mac), pero todavía tiene el mismo error.

+1

Es necesario leer la documentación del compilador de C/C++ que está utilizando. "-o" es una opción que produce un archivo de salida; el siguiente argumento debe especificar el nombre de ese archivo. "-l" especifica una biblioteca; la documentación le indicará la convención de nombres y la ubicación donde el compilador buscará esta biblioteca. Como una suposición, no ha instalado la biblioteca flexible. – kdgregory

+0

tengo el mismo problema. Mi programa está compilando con gcc, problema con la versión de g ++. – Dilawar

Respuesta

1

¿ha instalado la biblioteca flexible? si es así, pruebe algo como

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

Lo tengo instalado. Traté de cambiarlo de -lfl a C: /GnuWin32/lib/libfl.a (estoy tratando de usar Windows porque Linux tiene problemas extraños en mis computadoras y aún no tengo una Mac), pero todavía tiene el mismo error. – Micah

0

Añé mi archivo con esto.

main() 
{ 
    return (yylex()) 

} 

Ahora me está dando un error de segmentación pero puedo vincularlo.

10

El problema es que estás compilando hug.yy.c con g ++ (tratándolo como C++) en lugar de gcc. Este es el archivo que define yylex, por lo que al compilarlo como C++ se termina con una función yylex de C++, mientras que los otros archivos buscan una función C yylex.

Intente meter extern "C" int yylex(); en la primera sección de su archivo hug.l por lo que utilizará C vinculación para yylex en lugar de C++

Cuestiones relacionadas