我已阅读 this和 this但是,我还是不明白。详细说明如下.. (下面的例子是从第二个链接是答案的问题中偷来的——尽管它做了一些调整)
例如。假设我有 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创建的目标文件至少有一个符号表。
但是这个符号表是否包含符号 localfunction
和 myfunction
,其中 localfunction
的地址可能是 0x00233 而不是myfunction
的地址,它包含一个“引用”,作为链接器的注释,它必须将此符号与在其他地方找到的地址(即定义)连接起来,但前提是编译器能看出当前翻译单元中直接包含了定义吗?
所以就像编译器检查它是否可以找到符号的定义(也可以是一个对象),如果可以,它可以直接在符号表中包含一个地址,但如果找不到,它会添加一个reference/note 作为链接必须找到地址的相应符号的地址...
然后当链接过程开始时,链接器将搜索对应的地址,这些地址是给定符号的定义,该符号已被标记为“没有定义”或什么?
根据我对不同来源(包括wiki文章)的理解,这是我目前的理解,但我对此仍然很困惑,无法直观地看到它,并且上面写的理解可能是错误的,应该看到作为一个问题而不是解释。
有人可以帮忙吗?
最佳答案
虽然具体过程是实现定义的,但总体方法如下:
- 每个目标文件都有一个它定义的符号表,以及每个符号的地址。这是您示例中的 localfunction/233 。该文件中还有主要/某些地址的第二个定义。
- 此外,每个目标文件都列出了它需要的名称,以及需要插入地址的一个或多个位置。在您的情况下,这将是 myfunction,以及 main 主体内的地址,其中定义的地址是被插入。如果从多个地方调用 myfunction,就会有多个地方需要插入定义的地址。
- 当链接器组装可执行文件时,它会根据所需定义列表检查提供的定义列表。
- 首先,链接器检查每个未满足的引用是否只有一个定义。否则,链接器会发出多个 defs/undefined symbol 错误。
- 之后,链接器将每个已定义符号的地址插入到引用它们的位置。
链接过程到此结束。请注意,某些符号可能仍未被引用。在这种情况下,链接器可以选择从最终结果中删除定义。
关于c++ - 关于如何处理在另一个文件中定义的符号的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907609/