x.h:
void f();
x.c:
void f(){}
的main.c:
#include"x.h"
int main(){
f();
}
然後我用:gcc的-o a.out的main.c中 爲什麼說f是一個未定義的符號?
x.h:
void f();
x.c:
void f(){}
的main.c:
#include"x.h"
int main(){
f();
}
然後我用:gcc的-o a.out的main.c中 爲什麼說f是一個未定義的符號?
這是一個鏈接器錯誤。您需要同時編譯main.c
和x.c
,或者單獨編譯它們而不鏈接並鏈接生成的目標文件。
例如:
gcc -o x.o -c x.c
gcc -o main.o -c main.c
gcc -o myexecutable main.o x.o
您還必須包括在XC文件中的XH,並確保定義不被下面的代碼使用了兩次:
#ifndef X_H
#define X_H
f();
#endif
然後使用gcc -o a.out main.c xc
因爲f
未在x.h
中定義,所以只聲明。您需要將x.o
鏈接到您的可執行文件中。如果您不使用IDE,則可能需要設置Makefile
來處理此問題,並致電make
來構建您的項目。
這是因爲x.h
只是包含一個聲明,而不是定義一個符號。 x.c
包含該定義。
嘗試
gcc -o a.out main.c x.c
應該在編譯過程中這樣說,但可能在連接過程中。你還沒有編譯x.c(gcc -c x.c)?
OP正試圖理解.c和.h文件之間的根本區別。恕我直言,「翻譯部門」沒有解釋這一點。 – sigjuice 2011-04-23 10:18:25
我認爲OP實際上對編譯器的工作方式感到困惑(也就是說,他可能會期望因爲'main.c'包含'xh'編譯器知道要查找'xc'),但是在任何情況下*都是* a問題在這裏,它與建議的副本*不相同。 – dmckee 2011-04-23 18:51:38