Reputation: 465
I have four files list.h
list.c
test_list.c
Makefile
list.h
#ifndef List_H
#define List_H
#endif
/*nothing else*/
list.c
#include "list.h"
#include <stdio.h>
#include <stdlib.h>
/*nothing else*/
test_list.c
#include "list.h"
#include <stdio.h>
int main(){
return 0;
}
/*nothing else*/
Makefile
CC=cc
CXX=CC
CCFLAGS= -g -std=c99 -Wall -Werror
all: list test_list
%.o : %.c
$(CC) -c $(CCFLAGS) $<
test_list: list.o test_list.o
$(CC) -o test_list list.o test_list.o
test: test_list
./test_list
clean:
rm -f core *.o test_list
when I input make in shell, here comes the error:
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2 /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function
_start':(.text+0x18): undefined reference to
main' collect2: error: ld returned 1 exit status make: *** [list] Error 1
What is wrong here?
Upvotes: 0
Views: 3944
Reputation: 33631
You're already building your program as test_list
, so no need for a list
target.
Change:
all: list test_list
To:
all: test_list
Upvotes: 2
Reputation: 2080
You defined a target list but did not define a rule for it. So make tried its implicit rule to generate this target rule by emitting the following command
cc list.c -o list
so that you got the linking errors since there is no a symbol named main in list.c
You can see how the implicit rules work just by running
make -r
Upvotes: 3
Reputation: 75589
You have not specified a rule for building the target list
, so make
is inferring the following rule, which fails because you do not have a main
function in your list.c
.
cc list.c -o list
Since list
should not be built as an executable anyways (no main), simply do not try to build list
as a target in your Makefile
, and then test_list
will build correctly.
all: test_list
Upvotes: 7