0
votes

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 tomain' collect2: error: ld returned 1 exit status make: *** [list] Error 1

What is wrong here?

3
As an aside, your "%.o rule does the same as the implicit one. But you should probably make one for list.o, to add a dependency to list.h.juanchopanza

3 Answers

7
votes

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
3
votes

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
2
votes

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