Неопределенная ссылка на ошибку `WinMain @ 16 'при компиляции с gcc - PullRequest
0 голосов
/ 03 января 2019

Я собираюсь запустить простую программу, созданную с помощью Flex and Bison.

Вот мои коды.

Файл Flex (calc.l)

%{
#include <stdio.h>
#include <stdlib.h>
#include "tt.tab.h"
%}

/* %option noyywrap */
%%

[0-9]+(\.[0-9]+)?([eE][0-9]+)?  {yylval.f = atof(yytext); return NUM;}
[-+()*/]                        {return yytext[0];}
[\t\f\v\n]                      {;}

%%

int yywrap() {return -1} 

Файл зубров (tt.y)

%{
#include <stdio.h>
#include <stdlib.h>

extern int yylex();
void yyerror(char *msg);
%}

%{
#include <stdio.h>
#include <stdlib.h>

extern int yylex();
%}

%union {
    float f;
}

%token <f> NUM
%type <f> E T F

%%
S : E           {printf("f\n", $1);} 
  ;

E : E '+' T     {$$ = $1 + $3}
  | T           {$$ = $1;}
  ;

T : T '*' F     {$$ = $1 * $3}
  | F           {$$ = $1;}
  ;

F : '(' E ')'       {$$ = $2;}
  | '-' F           {$$ = -$2;}
  | NUM         {$$ = $1;}
%%

void yyerror(char *msg) {
    fprintf(stderr, "%s\n", msg);
    exit(1); 
}

Для компиляции я следую приведенным ниже командам в cmd.

Bison -d tt.y

Flex calc.l

gcc lex.yy.c tt.tab.c -o calc

, когда я запускаю последний gcc comman, появляется ошибка, подобная этой.

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../libmingw32.a(main.o):(.text.startup+0xb0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

В чем проблема в моих кодах или любых.Спасибо за внимание :)

1 Ответ

0 голосов
/ 03 января 2019

Вы не определяете функцию main , код, сгенерированный flex и bison, не определяет функцию main , вы должны определить ее самостоятельно, иначе программа не имеетточка входа.

У вас есть проблемы в ваших определениях:

  • в tt.y {printf("f\n", $1);} имеет формат, не совместимый с аргументом, должен быть `` {printf ("% f \ n ", $ 1);}`?
  • в tt.y объявляет yyerror в заголовке с объявлением yylex
  • в calc.l int yywrap() {return -1} должно быть int yywrap() {return -1;}

Минимальное основное определение равно:

int main()
{
   yyparse();
   return 0;
}

Вы можете поместить его с определением yyerror in tt.y

...