In C programming, what is `undefined reference`error, when compiling?

dimitris93 picture dimitris93 · May 2, 2015 · Viewed 49.9k times · Source

I have this following simple program I am trying to compile in linux ubuntu.

Main.c:

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

int main()
{   
    struct Person1 p1 = Person1_Constructor(10, 1000);
}

Person.c:

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

struct Person1 Person1_Constructor(const int age, const int salary)
{
    struct Person1 p;
    p.age = age;
    p.salary = salary;
    return p;
};

Person.h:

struct Person1
{
    int age, salary;
};
struct Person1 Person1_Constructor(const int age, const int salary);

Why do I get the following error ?

/tmp/ccCGDJ1k.o: In function `main':
Main.c:(.text+0x2a): undefined reference to `Person1_Constructor'
collect2: error: ld returned 1 exit status

I am using gcc Main.c -o Main to compile.

Answer

Diego picture Diego · May 2, 2015

When you link the program you need to give both Main.o and Person.o as inputs.

Build usually is done in two steps (1) compilation and (2) linking. To compile your sources do:

$ gcc -c -o Main.o Main.c
$ gcc -c -o Person.o Person.c

Or in one line:

$ gcc -c Main.c Person.c

Then the resulting object files must be linked into a single executable:

$ gcc -o Main Main.o Person.o

For small projects, of a few compilation units like yours, both step can be done in one gcc invocation:

$ gcc -o Main Main.c Person.c

both files must be given because some symbols in Person.c are used by Main.c.

For bigger projects, the two step process allows to compile only what changed during the generation of the executable. Usually this is done through a Makefile.