2014-03-24 40 views
0

我想運行的代碼具有生成文件,它顯示了錯誤:未定義的引用,而不是生成文件

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':(.text+0x20): undefined reference to `main' 
collect2: error: ld returned 1 exit status 
    make: *** [Nfa] Error 1 

與主要功能的文件是terp.c.
與主代碼的部分()是:

#ifdef MAIN 
#define ALLOCATE 
#include "global.h" /*externs for Verbose*/ 

#define SIZE 256 

PRIVATE char BUf[BSIZE] //input buffer 
PRIVATE char *Pbuf=BUf; //current position in input buffer 
PRIVATE char *Expr; //regular expression from command Line 

... 

跳過一些代碼在這裏,直到主...

void main (int argc,char *argv[]) 
{ 
int sstate; //Starting NFA state 
SET *start_dfastate;//Set of starting DFA states 
SET *current; //current DFA state 
SET *next; 
int accept; //current Dfa state is an accept 
int c;  //current input character 
int anchor; 

if (argc==2) 
    fprintf(stderr,"Expression is %s\n",argv[1]); 
else 
{ 
    fprintf(stderr,"Usage:terp pattern < input\n"); 
    exit(1); 
} 
//Compile the NFA create the initial state,and initialize the current state to the start state  
Expr=argv[1]; 
sstate=nfa(getline); 
next=newset(); 
ADD(next,sstate); 
if (!(start_dfastate=e_closure(next,&accept,&anchor))) 
{ 
    fprintf(stderr,"Internal error:State machine is empty\n"); 
    exit(1); 
} 
current=newset(); 
assign(current,start_dfastate); 

while (c=nextchar()) 
{ 
    if (next=e_closure(move(current,c),&accept,&anchor)) 
    { 
     if (accept) 
      printbuf(); 
     else 
     { 
      delset(current); 
      current=next; 
      continue; 
     } 
    } 
    delset(next); 
    assign(current,start_dfastate); 
} 
} 

#endif 

生成文件我使用:

​​
+1

顯示如何運行編譯器。您的主題提到了Makefiles,但您實際上沒有提及任何關於Makefile的內容或發佈問題主體中的任何規則。 – TypeIA

+0

請注意'void main()'在Windows上是合法的。根據標準和所有基於Unix的系統,main()的正確返回類型是int。 –

回答

3

由於您的第一行是:

#ifdef MAIN 

我會說你需要在編譯時定義它。
使用​​作爲makefilegcc預處理器選項(你可以把INC線低於此線):

CFLAGS=-DMAIN 

這樣一來,就會被列入當編譯器實際上是所謂:

${CC} -o [email protected] ${CFLAGS} $(INC) $^ ${LDFLAGS} ${LDLIBS} 
       ▲ 
       ║ 
       ╚═══ This will include the `MAIN` definition for compiling 

另一種選擇是全部刪除#ifdef MAIN。不要忘記從文件末尾刪除相應的#endif

+0

定義它在哪裏? – Paku

+0

在makefile中。如果您不知道如何,請將您的makefile粘貼到問題中。 – bosnjak

+0

是的,添加了makefile – Paku

相關問題