I am struggling with building a program with multiple files whith inter files function calls with makefile in C. Let’s say that I have a main file which call a function call_print_hello()
declared in a header file fdeclar_macros.h
and written in the file script1.c
. The function call_print_hello()
itself calls another function print_hello()
also declared in fdeclar_macros.h
and written in script2.c
. I have also a makefile
but when I run it I get the following error message:
gcc -g -Wall -c main.c
gcc -g -Wall -c script1.c
gcc -o main main.o script1.o
Undefined symbols for architecture x86_64:
"_call_print_hello", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1
Here are the content of the files:
makefile
:
CC = gcc
CFLAGS = -g -Wall
main: main.o script1.o
$(CC) -o main main.o script1.o
main.o: main.c fdeclar_macros.h
$(CC) $(CFLAGS) -c main.c
script2.o: script2.c fdeclar_macros.h
$(CC) $(CFLAGS) -c script2.c
script1.o: script1.c fdeclar_macros.h
$(CC) $(CFLAGS) -c script1.c
run: main
./main
clean:
$(RM) -rf justify *.dSYM *.o
main.c
:
#include "fdeclar_macros.h"
int main(){
call_print_hello();
return 0;
}
fdeclar_macros.h
:
#define NUMBER 3
void print_hello();
void call_print_hello();
script1.c
:
#include <stdio.h>
#include "fdeclar_macros.h"
void print_hello(){
printf("hello %d\n", NUMBER);
}
script2.c
:
#include "fdeclar_macros.h"
void call_print_hello(){
print_hello();
}
>Solution :
The make target for the main
executable does not contain a dependency on script2.o
and the rule to build main
does not link script2.o
into the main
executable either.
So the linker tries to build an executable with the content of script2.o
missing, but as that content is required, linking fails.