undefined symbol yylex

P

pavan734

Hello,
Please excuse me as Iam not posting this to correct group. I
have a parser code obtained from flex command. I have many other files.
When I compile them Iam getting a message like: undefined symbol yylex.
What might have went wrong?
 
T

tragomaskhalos

Hello,
Please excuse me as Iam not posting this to correct group. I
have a parser code obtained from flex command. I have many other files.
When I compile them Iam getting a message like: undefined symbol yylex.
What might have went wrong?

Two things to check spring to mind:
- Ensure that you are incorporating the generated lex.yy.c file into
your build
- If you are invoking yylex from a C++ file, make sure you use extern
"C" when declaring it.
You'll probably also get a link error for a missing yywrap. If so write
a simple C file with this in it:
int yywrap()
{ return 1; }

HTH.
 
R

Robbie Hatley

Hello,
Please excuse me as Iam not posting this to correct group. I
have a parser code obtained from flex command. I have many other files.
When I compile them Iam getting a message like: undefined symbol yylex.
What might have went wrong?

Compilers don't give error messages like that. That's a linker
error. Your files all compiled fine, but the linker couldn't
find something to link symbol yylex to. This can occur if you
list the flex library on the gcc command line, even if you're
not actually using flex in program. One thing that can cause
that is, you tell gcc to compile and link a bunch of modules
to an executable, but forget to include the module with main().

For example, when I try to make an exe file out of a blank cpp
file, like so:

// Begin blank.cpp
// (no content)
// End blank.cpp

gpp blank.cpp -lfl -o blank.exe

Error: in function "_main": libmain.c:11: Undefined reference
to symbol "_yylex". Collect2: ld returned 1 exit status.

What happened is, gcc sees that you mentioned the flex library,
so it assumes you want main() generated for you, and a reference
in main to a (non-existant) yylex funtion. Since you never
provided an actual flex file, there IS NO SUCH FUNCTION. So,
you get that error.

So, look to make sure you actually do have a main() function.
More generally, look for files you may have forgotten to include
in the build.

--
Cheers,
Robbie Hatley
East Tustin, CA, USA
lone wolf intj at pac bell dot net
(put "[usenet]" in subject to bypass spam filter)
http://home.pacbell.net/earnur/
 
P

pavan734

Thank you for your kind information. I came to knew much about flex.
Robbie said:
Hello,
Please excuse me as Iam not posting this to correct group. I
have a parser code obtained from flex command. I have many other files.
When I compile them Iam getting a message like: undefined symbol yylex.
What might have went wrong?

Compilers don't give error messages like that. That's a linker
error. Your files all compiled fine, but the linker couldn't
find something to link symbol yylex to. This can occur if you
list the flex library on the gcc command line, even if you're
not actually using flex in program. One thing that can cause
that is, you tell gcc to compile and link a bunch of modules
to an executable, but forget to include the module with main().

For example, when I try to make an exe file out of a blank cpp
file, like so:

// Begin blank.cpp
// (no content)
// End blank.cpp

gpp blank.cpp -lfl -o blank.exe

Error: in function "_main": libmain.c:11: Undefined reference
to symbol "_yylex". Collect2: ld returned 1 exit status.

What happened is, gcc sees that you mentioned the flex library,
so it assumes you want main() generated for you, and a reference
in main to a (non-existant) yylex funtion. Since you never
provided an actual flex file, there IS NO SUCH FUNCTION. So,
you get that error.

So, look to make sure you actually do have a main() function.
More generally, look for files you may have forgotten to include
in the build.

--
Cheers,
Robbie Hatley
East Tustin, CA, USA
lone wolf intj at pac bell dot net
(put "[usenet]" in subject to bypass spam filter)
http://home.pacbell.net/earnur/
 
P

pavan734

What is the significance of using extern "C". What makes using it to
avoid link error
 
T

tragomaskhalos

What is the significance of using extern "C". What makes using it to
avoid link error

Basically whenever you call C functions from C++ you must declare them
as extern "C".
Easiest explanation is to first Google for "C++ name mangling" and read
up on that. Now, using extern "C" tells the compiler that the symbols
in question (in this case yylex) come from C and have therefore not
been mangled. I think there may be other ramifications to do with
calling conventions but that's the gist of it.
 
H

Howard

Robbie Hatley said:
Compilers don't give error messages like that. That's a linker
error. Your files all compiled fine, but the linker couldn't
find something to link symbol yylex to. This can occur if you
list the flex library on the gcc command line, even if you're
not actually using flex in program. One thing that can cause
that is, you tell gcc to compile and link a bunch of modules
to an executable, but forget to include the module with main().

For example, when I try to make an exe file out of a blank cpp
file, like so:

// Begin blank.cpp
// (no content)
// End blank.cpp

gpp blank.cpp -lfl -o blank.exe

Error: in function "_main": libmain.c:11: Undefined reference
to symbol "_yylex". Collect2: ld returned 1 exit status.

What happened is, gcc sees that you mentioned the flex library,
so it assumes you want main() generated for you, and a reference
in main to a (non-existant) yylex funtion. Since you never
provided an actual flex file, there IS NO SUCH FUNCTION. So,
you get that error.

So, look to make sure you actually do have a main() function.
More generally, look for files you may have forgotten to include
in the build.

You've shown an "undefined reference" error, which is indeed a linker error.
But compilers do issue "undefined symbol" errors, which is what the OP said
it was. They occur when the symbol (such as a variable name) hasn't been
declared in the current scope. Different compilers may describe that
differently ("undeclared", "undefined", "unknown", whatever), of course, but
they do occur.

You may be right that it was a linker error, but from the original post,
there's no way to be sure of that (without some prior knowledge of that lex
stuff). Which is just another reason why posters should include the text of
the error message, and if it's a compile error, then the line(s) of code
referred to as well.

-Howard
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,156
Latest member
KetoBurnSupplement
Top