为什么编译时需要包含.o文件?

时间:2014-02-15 23:30:48

标签: c gcc compilation

当我编译程序并运行它时,我遇到了一个符号查找错误。我这样做了:

$ 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文件而不仅仅是头文件以避免符号查找或未定义的引用错误?

1 个答案:

答案 0 :(得分:1)

正如Tobias所提到的,头文件告诉编译器做了什么,目标文件告诉编译器它是如何完成的。您可以看到here目标文件的内容,但实际上它只是源文件的预编译版本。

实际上,您实际上并没有收到编译器错误,而是链接器错误。它知道如何编译你的源文件,但是在获得其他目标文件之前它无法将所有内容放在一起。