【问题标题】:Why do I need to include .o files when compiling?为什么编译时需要包含 .o 文件?
【发布时间】:2014-03-15 08:03:21
【问题描述】:

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

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

【问题讨论】:

  • 标题告诉你什么被定义了。目标文件提供了实际的定义。
  • 你在源文件中放了什么,你认为没有必要?

标签: c gcc compilation


【解决方案1】:

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

确实,您实际上并没有遇到编译器错误,而是链接器错误。它知道如何编译你的源文件,但它不能把所有东西放在一起,直到它得到其他目标文件。

【讨论】:

  • 谢谢。我对整个链接器过程进行了更多阅读,它变得越来越清晰。
猜你喜欢
  • 2020-09-09
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多