#c #linker #yacc #lex
#c #компоновщик #yacc #лексический
Вопрос:
привет, я получаю следующую ошибку
main.c: undefined reference to yyin
main.c: undefined reference to yyparse
это то, что я делаю
у меня есть файл lex
a.l
файл yacc
b.y
main.c является :
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
extern int yyparse();
extern FILE *yyin;
FILE *outFile_p;
main(int argc,char *argv[])
{
if(argc<3)
{
printf("Please specify the input file amp; output filen");
exit(0);
}
FILE *fp=fopen(argv[1],"r");
if(!fp)
{
printf("couldn't open file for readingn");
exit(0);
}
outFile_p=fopen(argv[2],"w");
if(!outFile_p)
{
printf("couldn't open temp for writtingn");
exit(0);
}
yyin=fp;
yyparse();
fclose(fp);
fclose(outFile_p);
}
перед этим я должен связать:
x.h
и x.c.
Я пишу следующие команды на терминале :
lex a.l
yacc -v -d b.y
gcc -o x.o -c x.c
gcc -o main.o -c main.c
gcc -o myexecutable main.o x.o
вот когда я получаю эту ошибку. что я делаю не так?
Комментарии:
1. Я не уверен, что это хорошая идея
#include <iostream.h>
в программе на C…2. Достаточно вызвать,
gcc -c foo.c
чтобы получить объектный файл с именемfoo.o
.
Ответ №1:
Кажется, вы игнорируете .c
файлы, сгенерированные lex и yacc. Они часто вызываются y.tab.c
и lex.yy.c
, но вам лучше проверить это самостоятельно. Тогда последовательность вызовов должна каким-то образом напоминать следующую:
lex a.l
yacc -v -d b.y
gcc -c y.tab.c
gcc -c lex.yy.c
gcc -c x.c
gcc -c main.c
gcc -o myexecutable *.o
Ответ №2:
Я только что понял это. добавьте следующее в ваш файл main.c:
extern FILE *yyin;
extern FILE *yyout;
extern int yyparse(void);