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 tolookup'
lex.yy.c:(.text+0x264): undefined reference to insert' lex.yy.c:(.text+0x279): undefined reference tosymtable'
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??

0

Szablon projektu znajdziesz tutaj:

http://www.thebinaryidiot.com[...]er-using-flex-and-bison-in-c/

A tutaj prościej-się-nie-da przykłady:
http://www.mario-konrad.ch/index.php?page=20024

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