關係

2011-04-23 52 views
1

可能重複:
What is a 「translation unit」 in C++關係

可能重複: What is a "translation unit" in C++

x.h:

void f(); 

x.c:

void f(){} 

的main.c:

#include"x.h" 
int main(){ 
    f(); 
} 

然後我用:gcc的-o a.out的main.c中 爲什麼說f是一個未定義的符號?

+0

OP正試圖理解.c和.h文件之間的根本區別。恕我直言,「翻譯部門」沒有解釋這一點。 – sigjuice 2011-04-23 10:18:25

+1

我認爲OP實際上對編譯器的工作方式感到困惑(也就是說,他可能會期望因爲'main.c'包含'xh'編譯器知道要查找'xc'),但是在任何情況下*都是* a問題在這裏,它與建議的副本*不相同。 – dmckee 2011-04-23 18:51:38

回答

4

這是一個鏈接器錯誤。您需要同時編譯main.cx.c,或者單獨編譯它們而不鏈接並鏈接生成的目標文件。

例如:

gcc -o x.o -c x.c 
gcc -o main.o -c main.c 
gcc -o myexecutable main.o x.o 
0

您還必須包括在XC文件中的XH,並確保定義不被下面的代碼使用了兩次:

#ifndef X_H 
#define X_H 
f(); 
#endif 

然後使用gcc -o a.out main.c xc

0

因爲f未在x.h中定義,所以只聲明。您需要將x.o鏈接到您的可執行文件中。如果您不使用IDE,則可能需要設置Makefile來處理此問題,並致電make來構建您的項目。

1

這是因爲x.h只是包含一個聲明,而不是定義一個符號。 x.c包含該定義。

嘗試

gcc -o a.out main.c x.c 
0

應該在編譯過程中這樣說,但可能在連接過程中。你還沒有編譯x.c(gcc -c x.c)?