makefile i flex problem z kompilacja

0

witam. Stworzylem makefile ktory powinien mi kompilowac pliki lacznie z plikiem flex. Ale podczas wywolywania make -f mymake otrzymuje nastepujacy error:

flex lexer_flex.l
gcc lex.yy.c -lfl
/tmp/ccaKWf9I.o: In function yylex': lex.yy.c:(.text+0x246): undefined reference to lookup'
lex.yy.c:(.text+0x264): undefined reference to insert' lex.yy.c:(.text+0x279): undefined reference to symtable'
collect2: ld returned 1 exit status
make: *** [lexer.o] Error 1

definicje funkcji lookup i insert, symptable sa umieszczone w pliku naglowkowy gl.h

a oto moj makefile:



CC=gcc
CFLAGS=-c -Wall
BIBL = gl.h
FLEX = flex
all: make_init

make_init: flex.c main.o error.o init.o lexer.o
	$(CC) flex.c main.o error.o init.o lexer.o -o make_init

flex.c: lexer_flex.l
	$(FLEX) lexer_flex.l

main.o: main.c
	$(CC) $(CFLAGS) main.c

error.o: error.c ${BIBL}
	$(CC) $(CFLAGS) error.c

init.o: init.c ${BIBL}
	$(CC) $(CFLAGS) init.c

lexer.o: lex.yy.c
	$(CC) lex.yy.c -lfl

clean:
	rm -rf *o make_init

 

prosze o pomoc,sprawa jest na prawde pilna

0

Sprawdź kolejność jednostek kompilacji przy linkerze (make_init). Wszystkie funkcje używane w kolejno umieszczanych plikach .o powinny być zdefiniowane w plikach lub bibliotekach występujących po nich w wywołaniu linkera (w tym przypadku $(CC)).

0

po dodaniu bliblioteki takze nic sie nie dzieje

 
lexer.o: lex.yy.c $(BIBL)
        $(CC) lex.yy.c -lfl

mam tylko jeden plik naglowkowy i pozostale zdefiniowane pola i funkcje sa widziane przez lexer_flex.l poza tymi 3

0

po dodaniu -c do linijki lexer.o dostaje taki error:

flex -c lexer_flex.l
gcc -c lex.yy.c -lfl
gcc flex.c main.o emitter.o error.o init.o lexer.o parser.o symbol.o -o make_init
gcc: flex.c: No such file or directory
make: *** [make_init] Error 1

0

pozostale pliki sa na pewno dobre, jedynki plik ktory moze stwarzac problem to jest lexer_flex.l
oto on:

 

%{
#include "global.h"
int lineno = 1;
int tokenval = NONE;

%}
DIGIT [0-9]
LETTERS [A-Za-z]
ENTER [\n]

%%
{DIGIT}+ {
	  scanf ("%d", &tokenval);
	  return NUM;
	}

{LETTERS}+ {
	int p = 0;
	  while (isalnum (yytext))
 
	    {
	      if (yyleng >= BSIZE)
		error ("compiler error");
	    }
	    
	  p = lookup (yytext);
	  if (p == 0)
	    p = insert (yytext, ID);
	  tokenval = p;
	  return symtable[p].token;
	}

{ENTER} {
lineno++;
	}


%%

a co do tego pliku flex.c to go nie ma, ale wlasnie w tym caly sęk zeby wygenerowac plik .c na postawie kompilacji flex lexer_flex.l

0

ok, flexa to juz sobie recznie skompiluje, poza makefilem, pozostal jeszcze problem z:

collect2: ld returned 1 exit status
make: *** [make_init] Error 1

i jeszcze problem z funkcja yylex(), czy musze napisac definicje tej funkcji w jakims pliku naglowkowym aby byla ona dostepna dla pozostalych plikow??

1 użytkowników online, w tym zalogowanych: 0, gości: 1