2014-02-15 60 views
1

當我編譯我的程序並運行它時,我得到了一個符號查找錯誤。我這樣做:編譯時爲什麼需要包含.o文件?

$ gcc -o parts parts.c -lnettle 
$ ./parts 
$ ./parts: symbol lookup error: ./parts: undefined symbol: nettle_pbkdf2 

我的代碼中包含了這些頭文件:

#include <nettle/pbkdf2.h> 
#include <nettle/hmac.h> 
#include <pbkdf2-hmac-sha1.c> 

我通過包括gcc編譯過程中兩個包含的頭文件的目標文件解決我的問題。

$ gcc -o parts parts.c hmac.o pbkdf2.o -lnettle 

事情是,我不明白髮生了什麼,因此爲什麼這個工程。爲什麼我必須包含.o文件而不僅僅是頭文件以避免符號查找或未定義的引用錯誤?

+2

標題告訴你*定義了什麼*。目標文件提供了實際的定義。 –

+0

你在你的源文件中放了什麼,你認爲是如此不必要? – Beta

回答

1

正如Tobias提到的,頭文件告訴編譯器做了什麼,目標文件告訴編譯器它是如何完成的。你可以看到here目標文件,但實際上它只是源文件的預編譯版本。

確實,您實際上沒有收到編譯器錯誤,但鏈接器錯誤。它知道如何編譯你的源文件,但它不能把所有東西放在一起,直到它得到其他目標文件。

+0

謝謝。我在整個鏈接過程中做了更多的閱讀,並且它變得更加清晰。 – userYou

相關問題