2015-05-02 5 views
6

Ich habe dieses folgende einfache Programm Ich versuche, in Linux Ubuntu zu kompilieren.In C-Programmierung, was ist `undefined reference`error, wenn kompilieren?

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); 

Warum bekomme ich folgende Fehler?

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

Ich verwende gcc Main.c -o Main zu kompilieren.

+0

@ Satya uh, warum? Ich habe eine 'Person.c' und eine' Person.h' was ist damit falsch? – dimitris93

+0

gcc zwei .c Dateien zusammen – user3528438

Antwort

4

Wenn Sie das Programm verknüpfen, müssen Sie Main.o und Person.o als Eingaben angeben.

Die Erstellung erfolgt in der Regel in zwei Schritten (1) Kompilierung und (2) Verknüpfung. kompilieren Ihre Quellen zu tun:

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

Dann werden die resultierenden Objektdateien in eine einzige ausführbare Datei verknüpft werden müssen:

$ gcc -o Main Main.o Person.o 

Für kleine Projekte, von wenigen Übersetzungseinheiten wie das Ihre, können beide Schritt in einem gcc Aufruf getan:

$ gcc -o Main Main.c Person.c 

beide Dateien gegeben werden müssen, da einige Symbole in Person.c verwendet werden von Main.c.

Bei größeren Projekten ermöglicht der zweistufige Prozess, nur das zu kompilieren, was während der Generierung der ausführbaren Datei geändert wurde. Normalerweise wird dies durch ein Makefile gemacht.

+0

können Sie mir den richtigen Weg geben, um dies zu kompilieren? Momentan benutze ich 'gcc Main.c -o Main' – dimitris93

+2

@Shiro'gcc Main.c Person.c -o Main' – user3528438

+0

also muss ich eigentlich jede .c Datei in diesem einzigen Befehl erwähnen? Ich wusste nichts davon, danke – dimitris93

1

Das Problem tritt wahrscheinlich auf, weil Sie nur Main.c kompilieren, wenn Sie Main.c und Person.c zur gleichen Zeit kompilieren müssen. Versuchen Sie, es als gcc Main.c Person.c -o MyProgram zu kompilieren.

Wenn Sie mehrere Dateien haben, müssen diese alle beim Kompilieren angegeben werden, um externe Referenzen aufzulösen, wie es hier der Fall ist. Der Compiler spuckt Objektdateien aus, die später mit einer ausführbaren Datei verknüpft werden. Sehen Sie sich dieses Tutorial zu Makefiles an: Make File Tutorial Es hilft, diesen Prozess zu automatisieren.

Verwandte Themen