2015-05-02 2 views
6

У меня есть следующая простая программа, которую я пытаюсь скомпилировать в linux ubuntu.В программировании на С, что такое `undefined reference`error, при компиляции?

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

Зачем нужна следующая Ошибка?

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

Я использую gcc Main.c -o Main для компиляции.

+0

@ Сатья, почему? У меня есть «Person.c» и «Person.h», что с этим не так? – dimitris93

+0

gcc два файла .c вместе – user3528438

ответ

4

Когда вы связываете программу, вам необходимо предоставить как Main.o, так и Person.o в качестве входных данных.

Построение обычно выполняется в два этапа (1) компиляции и (2) связывание. Чтобы компилировать ваши источники делают:

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

Затем полученные объектные файлы должны быть связаны в один исполняемый файл:

$ gcc -o Main Main.o Person.o 

Для небольших проектов из нескольких единиц компиляции, как ваши, как шаг может быть сделано в одном gcc вызова:

$ gcc -o Main Main.c Person.c 

оба файла должны быть предоставлены, поскольку некоторые символы в Person.c используются от Main.c.

Для больших проектов двухэтапный процесс позволяет скомпилировать только то, что было изменено во время генерации исполняемого файла. Обычно это делается через Makefile.

+0

Можете ли вы дать мне правильный способ скомпилировать это? Прямо сейчас я использую 'gcc Main.c -o Main' – dimitris93

+2

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

+0

, поэтому я должен фактически упомянуть каждый .c файл в этой единственной команде? Я не знал об этом, спасибо – dimitris93

1

Проблема, вероятно, возникает из-за того, что вы компилируете только Main.c, когда необходимо компилировать Main.c и Person.c в то же время. Попробуйте скомпилировать его как gcc Main.c Person.c -o MyProgram.

Всякий раз, когда у вас есть несколько файлов, все они должны быть указаны при компиляции для разрешения внешних ссылок, как в данном случае. Компилятор выплевывает объектные файлы, которые позже будут связаны с исполняемым файлом. Ознакомьтесь с этим руководством по make-файлам: Make File Tutorial Это помогает автоматизировать этот процесс.