【发布时间】:2021-12-06 03:23:26
【问题描述】:
假设我有一个名为 main.h 的文件,其中我声明了一些函数
void func();
然后我有一个包含定义的文件 main.cpp。 最后我有一个名为 a.cpp 的文件,其中包含 main() 并且只运行所有这些函数但我也有一些像这样声明的变量:
string a = "t";
int b = 2;
现在我的问题是链接器会将所有这些组合成一个可执行文件,对吗?但我的意思是变量a 和b 它们与任何东西有联系吗?我的意思是他们已经有了正确的定义,并且所有这些代码都以某种方式组合到一个可执行文件中,对吗?那么可以公平地说链接器也只是组合了所有 3 个文件中的所有代码吗?它看到声明并为它们找到定义,但是对于这些变量和东西,它们实际上没有任何要链接的东西,所以链接器甚至对它们做任何事情吗?或者像我之前说的,链接器基本上将所有这些代码组合在一起是否正确?
【问题讨论】:
-
大致:编译器将源文件编译为中间二进制文件(目标文件),每个 cpp 文件对应一个。为此,它使用头文件来了解代码其他部分的符号。 (细节:在模板/内联函数的情况下,也从这些头文件中获取源代码)。所以 func 会在 somefile.obj 中结束,而 a 和 b 会在 main.obj 中结束。然后链接器会将它们组合成一个可执行文件(或静态或动态可链接库)
标签: c++