动态链接与静态链接效率

时间:2013-01-11 21:03:57

标签: c++ dll static-libraries

我与另一位开发人员有争执,我想通过动态链接与静态链接来解决这个问题。

理论上:

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

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

您的应用程序只会调用或依赖其中一个。

您可以使用两种方法。

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

    谁是对的?

2 个答案:

答案 0 :(得分:3)

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

遵循经典,简单的事物模型,链接器将链接到库中的任何目标文件以满足符号引用,因此如果你的A(),B()和C()都被定义为不同的对象文件,只有包含您实际使用的符号的目标文件才会链接到程序中(除非它依赖于其他一个或多个,在这种情况下,链接器会找到满足这些引用的目标文件)同样,递归,直到它满足所有,或找到一个它不能满足(此时你会得到标准的“未解析的外部XXX”错误消息)。

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

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

答案 1 :(得分:2)

取决于: - )

如果您将每个函数放在自己的源文件中,或使用/Gy compile option,则每个函数都将打包在静态库的单独部分中。

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