使用gcc编译时未定义对“ WinMain @ 16”错误的引用

时间:2019-01-03 05:20:50

标签: gcc compiler-construction bison flex-lexer

我将运行一个用Flex a 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中的命令。

野牛-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 :(得分:1)

您没有定义 main 函数,flex和bison生成的代码没有定义 main 函数,您必须自己定义它,否则程序会做没有入口点。

您的定义有问题:

  • 在tt.y {printf("f\n", $1);}中的格式与参数不兼容,必须为“ {printf(“%f \ n”,$ 1);}`?
  • 在tt.y中的
  • 在标头中声明 yylex
  • yyerror calc.l int yywrap() {return -1}中的
  • 必须为int yywrap() {return -1;}

最小的 main 定义是:

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

您可以在tt.y

中将其定义为 yyerror
相关问题