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

标签 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 文件而不仅仅是头文件以避免符号查找或 undefined reference 错误?

最佳答案

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

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

关于c - 为什么编译时需要包含.o文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805136/

相关文章:

c - 在纯 C 的 gcc 中禁用命名返回值优化

compilation - 获取 WebStorm 中依赖的 TypeScript 文件的编译错误

Java RCaller 重用一个函数

c - 接口(interface) Go 与 C 库

c - 自上而下的合并排序算法产生不匹配的列表

c - 外部存储类和全局变量

c - 简单的USB驱动程序

无法与 Linux 上的 Lua 库链接

c - 如何禁用 avr-gcc 的 "appears to be a misspelled interrupt handler"警告?

caching - 用于编译的 RAM 驱动器 - 有这样的东西吗?