22

Undefined symbols for the x86_64 architecture: & ldquo; _yylval, referenced...

 2 years ago
source link: https://www.codesd.com/item/undefined-symbols-for-the-x86-64-architecture-yylval-referenced-from-yylex-on-mac-os.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Undefined symbols for the x86_64 architecture: & ldquo; _yylval, referenced from _yylex on Mac OS

advertisements

I'm trying out some examples from O'Reilly Flex & Bison. The first Bison and Flex program I'm trying gives me next error when linking the sources:

Undefined symbols for architecture x86_64: "_yylval", referenced

from:

  _yylex in lex-0qfK1M.o

As I'm new to Mac and I'm just trying the examples, I have no clue what's wrong here.

l file:

/* recognize tokens for the calculator and print them out */
%{
#include "fb1-5.tab.h"
%}

%%
"+"     { return ADD; }
"-"     { return SUB; }
"*"     { return MUL; }
"/"     { return DIV; }
"|"     { return ABS; }
[0-9]+  { yylval = atoi(yytext); return NUMBER; }
\n      { return EOL; }
[ \t]   { /* Ignore whitespace */ }
.       { printf("Mystery character %c\n", *yytext); }
%%

y file:

/* simplest version of calculator */
%{
#include <stdio.h>
%}
/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL
%%
calclist: /* nothing */ matches at beginning of input
 | calclist exp EOL { printf("= %d\n", $1); } EOL is end of an expression
 ;
exp: factor default $$ = $1
 | exp ADD factor { $$ = $1 + $3; }
 | exp SUB factor { $$ = $1 - $3; }
 ;
factor: term default $$ = $1
 | factor MUL term { $$ = $1 * $3; }
 | factor DIV term { $$ = $1 / $3; }
 ;
term: NUMBER default $$ = $1
 | ABS term { $$ = $2 >= 0? $2 : - $2; }
 ;
%%
main(int argc, char **argv)
{
    yyparse();
}

yyerror(char *s)
{
    fprintf(stderr, "error: %s\n", s);
}

Command line:

bison -d fb1-5.y
flex fb1-5.l
cc -o $@ fb1-5.tab.c lex.yy.c -ll

I use -ll instead of -lfl because apparently on Mac os x, the fl library isn't there.

Output:

Undefined symbols for architecture x86_64:
  "_yylval", referenced from:
      _yylex in lex-0qfK1M.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Any ideas?


I caused a similar error by compiling a lex file that began

%{
#include "y.tab.h"
%}

using the command

gcc -ll lex.yy.c

This worked:

gcc -ll y.tab.c lex.yy.c

What's going on? There's a declaration in y.tab.h

extern int yylval

which allows lex.yy.c to compile. However, lex.yy.o needs to be linked against an object file that includes yylval, such as y.tab.o


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK