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

C 为什么编译时需要包含.o文件?,c,gcc,compilation,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-hma

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

$ 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>

问题是,我不明白发生了什么,也不明白为什么会这样。为什么我必须包含.o文件而不仅仅是头文件,以避免符号查找或未定义的引用错误?

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


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

标题告诉您定义了什么。目标文件提供了实际的定义。你在源文件中放了什么,你认为是不必要的?谢谢。我对整个链接器过程做了更多的阅读,它变得越来越清晰。
$ gcc -o parts parts.c hmac.o pbkdf2.o -lnettle