c++ - 关于如何处理在另一个文件中定义的符号的困惑

标签 c++

我已阅读 thisthis但是,我还是不明白。详细说明如下.. (下面的例子是从第二个链接是答案的问题中偷来的——尽管它做了一些调整)

例如。假设我有 3 个文件

主要.cpp

我的函数.cpp

我的函数.hpp


//main.cpp

#include "myfunction.hpp"
void localfunction() {};
int main() {
  int A = myfunction( 12 );
  ...
}

//myfunction.cpp

#include "myfunction.hpp"
int myfunction( int x ) {
  retu
rn x * x;
}

//myfunction.hpp

int myfunction( int x );

所以main.cpp创建的目标文件至少有一个符号表。

但是这个符号表是否包含符号 localfunctionmyfunction ,其中 localfunction 的地址可能是 0x00233 而不是myfunction 的地址,它包含一个“引用”,作为链接器的注释,它必须将此符号与在其他地方找到的地址(即定义)连接起来,但前提是编译器能看出当前翻译单元中直接包含了定义吗?

所以就像编译器检查它是否可以找到符号的定义(也可以是一个对象),如果可以,它可以直接在符号表中包含一个地址,但如果找不到,它会添加一个reference/note 作为链接必须找到地址的相应符号的地址...

然后当链接过程开始时,链接器将搜索对应的地址,这些地址是给定符号的定义,该符号已被标记为“没有定义”或什么?

根据我对不同来源(包括wiki文章)的理解,这是我目前的理解,但我对此仍然很困惑,无法直观地看到它,并且上面写的理解可能是错误的,应该看到作为一个问题而不是解释。

有人可以帮忙吗?

最佳答案

虽然具体过程是实现定义的,但总体方法如下:

  • 每个目标文件都有一个它定义的符号表,以及每个符号的地址。这是您示例中的 localfunction/233 。该文件中还有主要/某些地址的第二个定义。
  • 此外,每个目标文件都列出了它需要的名称,以及需要插入地址的一个或多个位置。在您的情况下,这将是 myfunction,以及 main 主体内的地址,其中定义的地址是被插入。如果从多个地方调用 myfunction,就会有多个地方需要插入定义的地址。
  • 当链接器组装可执行文件时,它会根据所需定义列表检查提供的定义列表。
  • 首先,链接器检查每个未满足的引用是否只有一个定义。否则,链接器会发出多个 defs/undefined symbol 错误。
  • 之后,链接器将每个已定义符号的地址插入到引用它们的位置。

链接过程到此结束。请注意,某些符号可能仍未被引用。在这种情况下,链接器可以选择从最终结果中删除定义。

关于c++ - 关于如何处理在另一个文件中定义的符号的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907609/

相关文章:

C++ 日志框架建议

c++ - 为什么我的编译器在我尝试清除 cin 缓冲区时提示

c++ - MFCC中如何取前13个系数

c++ - cin怎么了?它进入无限循环

c++ - Variadic 模板元编程 : a bug in clang++ or g++?

C++ 使用传递函数

c++ - QDialog不在循环中绘画

c++ - 何时在空实例上调用成员函数会导致未定义的行为?

c++ - 为什么此 vector vector 超出范围?

c++ - 从 g++ 输出中删除不需要的汇编程序语句