2015-05-02 7 views
6

Ho questo seguente semplice programma Sto cercando di compilare in linux ubuntu.Nella programmazione in C, che cosa è `riferimento non definito, durante la compilazione?

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

Perché ottengo il seguente errore ?

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

Sto utilizzando gcc Main.c -o Main per compilare.

+0

@Satya uh, perché? Ho un 'Person.c' e un' Person.h' che cosa non va? – dimitris93

+0

gcc due file .c insieme – user3528438

risposta

4

Quando si collega il programma è necessario assegnare sia Main.o che Person.o come input.

La compilazione di solito avviene in due fasi (1) compilazione e (2) collegamento. Per compilare le tue fonti fanno:

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

Poi i file oggetto risultanti devono essere collegati in un unico file eseguibile:

$ gcc -o Main Main.o Person.o 

per i piccoli progetti, di poche unità di compilazione come la vostra, sia passo può essere fatto in una gcc invocazione:

$ gcc -o Main Main.c Person.c 

entrambi i file deve essere data poiché sono stati utilizzati alcuni simboli in Person.c di Main.c.

Per progetti di dimensioni maggiori, il processo in due passaggi consente di compilare solo ciò che è cambiato durante la generazione dell'eseguibile. Di solito questo viene fatto attraverso un Makefile.

+0

puoi darmi il modo corretto di compilare questo? In questo momento sto usando 'gcc Main.c -o Main' – dimitris93

+2

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

+0

quindi devo effettivamente menzionare ogni file .c in quel singolo comando? Non lo sapevo, grazie – dimitris93

1

Il problema si verifica probabilmente perché si sta compilando solo Main.c quando è necessario compilare Main.c e Person.c allo stesso tempo. Prova a compilarlo come gcc Main.c Person.c -o MyProgram.

Ogni volta che si dispone di più file, tutti devono essere specificati durante la compilazione al fine di risolvere i riferimenti esterni, come nel caso qui. Il compilatore sputerà i file oggetto che verranno successivamente collegati a un eseguibile. Dai un'occhiata a questo tutorial sui makefile: Make File Tutorial Aiuta ad automatizzare questo processo.