1

我与另一位开发人员发生了争执,我想在这里解决动态链接与静态链接的问题。

理论上:

假设你有一个包含 100 个函数的库,每个函数里面都有大量代码:

int A()
int B()
int C()
..
..and so on...

而且您的应用程序只调用或依赖于其中之一。

您可以使用两种方法。

  1. 将库构建为动态链接库
  2. 将库构建为静态链接库

我的同事声称将静态库链接到我们的应用程序,编译器/链接器不会将 99 个未使用函数的代码添加到我们的可执行文件中。我声称它会的。我声称在这种情况下唯一的优点是拥有一个可执行文件并且不必与我们的应用程序一起分发库,但如果我们使用动态链接库方法,它不会有显着的大小差异。

谁是正确的?

4

2 回答 2

3

它可能取决于代码的组织方式以及您使用的编译器标志的组合。

遵循经典的简单模型,链接器将链接库中需要满足符号引用的任何目标文件,因此如果您的 A()、B() 和 C() 分别定义在不同的目标文件中,只有包含您实际使用的符号的目标文件才会链接到程序中(除非它反过来依赖于其他一个或多个,在这种情况下,链接器也会找到满足这些引用的目标文件,递归地,直到它满足所有条件,或者找到一个它不能满足的条件(此时您会收到标准的“未解析的外部 XXX”错误消息)。

最近,大多数编译器可以将函数“打包”到单独的“模块”中,而不必将它们放入单独的源文件中以创建单独的目标文件。细节各不相同,但可以减少(或消除)使每个源文件尽可能小的必要性,以便将最终可执行文件中的内容保持在最低限度。

所以,底线:至少在大多数情况下,他是对的,而你是错的。

于 2013-01-11T21:15:41.227 回答
2

这取决于 :-)

如果您将每个函数放在其自己的源文件中,或使用/Gy 编译选项,则每个函数将被打包在静态库的单独部分中。

然后链接器将能够根据需要选择它们,并且只包含实际调用的函数。

于 2013-01-11T21:15:39.703 回答