Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Undefined symbols error when using a header file

I'm getting the following error and can't for the life of me figure out what I'm doing wrong.

$ gcc main.c -o main

Undefined symbols:
  "_wtf", referenced from:
      _main in ccu2Qr2V.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

main.c:

#include <stdio.h>
#include "wtf.h"

main(){
    wtf();
}

wtf.h:

void wtf();

wtf.c:

void wtf(){
    printf("I never see the light of day.");
}

Now, if I include the entire function in the header file instead of just the signature, it complies fine so I know wtf.h is being included. Why doesn't the compiler see wtf.c? Or am I missing something?

Regards.

like image 237
Chris Cummings Avatar asked Jun 04 '10 07:06

Chris Cummings


2 Answers

You need to link wtf with your main. Easiest way to compile it together - gcc will link 'em for you, like this:

gcc main.c wtf.c -o main

Longer way (separate compilation of wtf):

gcc -c wtf.c
gcc main.c wtf.o -o main

Even longer (separate compilation and linking)

gcc -c wtf.c
gcc -c main.c
gcc main.o wtf.o -o main

Instead of last gcc call you can run ld directly with the same effect.

like image 137
qrdl Avatar answered Oct 05 '22 16:10

qrdl


You are missing the fact that merely including a header doesn't tell the compiler anything about where the actual implementation (the definitions) of the things declared in the header are.

They could be in a C file next to the one doing the include, they could come from a pre-compiled static link library, or a dynamic library loaded by the system linker when reading your executable, or they could come at run-time user programmer-controlled explicit dynamic loading (the dlopen() family of function in Linux, for instance).

C is not like Java, there is no implicit rule that just because a C file includes a certain header, the compiler should also do something to "magically" find the implementation of the things declared in the header. You need to tell it.

like image 22
unwind Avatar answered Oct 05 '22 16:10

unwind