2015-05-02 83 views
6

我有下面這個簡單的程序,我想在linux ubuntu中編譯。在C編程中,編譯時什麼是`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

@Satya呃,爲什麼?我有一個'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 -o Main Main.c Person.c 

兩個文件必須給予因爲Person.c一些符號:在一個gcc調用完成通過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.cPerson.c時。嘗試編譯爲gcc Main.c Person.c -o MyProgram

只要你有多個文件,它們都需要被指定爲了解決外部引用編譯時,比如這裏的情況。編譯器會吐出稍後會鏈接到可執行文件的目標文件。看看這個關於makefiles的教程:Make File Tutorial它有助於自動化這個過程。

相關問題