Tuesday, April 19, 2022

[SOLVED] makefile: undefined reference to main

Issue

I am working on a simple project that generates 2 executable files, main and Server.

The program in Main.c makes use of code present in user_interface.c through the header file user_interface.h.

The Makefile I have written is as follows,

all: main user_interface.o Server

main: user_interface.o main.c
    gcc main.c user_interface.o -o main

user_interface.o: user_interface.c user_interface.h
    gcc user_interface.c -o user_interface.o

Server: Server.c
    gcc Server.c -o Server

clean:
    rm -rf main *.o Server

When I type make on the terminal, I get the following error:

gcc user_interface.c -o user_interface.o
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [Makefile:18: user_interface.o] Error 1

How do I navigate past this error?


Solution

Your rule for user_interface.o is wrong. You need to use the -c option to tell it that it's creating an object file rather than an executable, so it doesn't need a main() function.

all: main Server

main: user_interface.o main.o
    gcc main.o user_interface.o -o main

main.o: main.c
    gcc -c main.c

user_interface.o: user_interface.c
    gcc -c user_interface.o

Server: Server.c
    gcc Server.c -o Server

clean:
    rm -rf main *.o Server

make actually has a built-in rule for compiling .c to .o, so you don't actually need those rules.



Answered By - Barmar
Answer Checked By - Mary Flores (WPSolving Volunteer)