Неопределенная ссылка вместо makefile

Код, который я хочу запустить, имеет make-файл, и он показывает ошибку:

/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.
Часть кода с main ():

 #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 

В make-файле я использую:

  FILES.o=set.o hash.o printnfa.o input.o nfa.o terp.o assort.o prnt.o printv.o bintoasc.o ferr.o onferr.o fputstr.o pchar.o driver.o searchenv.o hashadd.o esc.o PROGRAM= Nfa INC := -I./debug.h -I./global.h all: ${PROGRAM} ${PROGRAM}: ${FILES.o} ${CC} -o $@ ${CFLAGS} $(INC) $^ ${LDFLAGS} ${LDLIBS} 

Поскольку ваша первая строка:

 #ifdef MAIN 

Я бы сказал, что вам нужно определить это при компиляции.
Используйте -DMAIN как опцию препроцессора для gcc в makefile -DMAIN (вы можете поместить эту строку ниже строки INC ):

 CFLAGS=-DMAIN 

Таким образом, он будет включен, когда на самом деле вызывается компилятор:

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

Другой вариант – удалить #ifdef MAIN alltogether. Не забудьте удалить соответствующий #endif с конца файла.