我与另一位开发人员有争执,我想通过动态链接与静态链接来解决这个问题。
理论上:
假设您有一个包含100个函数的库,每个函数都包含大量代码:
int A()
int B()
int C()
..
..and so on...
您的应用程序只会调用或依赖其中一个。
您可以使用两种方法。
我的同事声称将静态库链接到我们的应用程序,编译器/链接器不会将99个未使用函数的代码添加到我们的可执行文件中。我声称它会。我声称在这种情况下唯一的优点是只有一个可执行文件,而不必使用我们的应用程序分发库,但如果我们使用动态链接的库方法,它将没有显着的大小差异。
谁是对的?
答案 0 :(得分:3)
它可能取决于代码的组织方式以及您使用的编译器标志的组合。
遵循经典,简单的事物模型,链接器将链接到库中的任何目标文件以满足符号引用,因此如果你的A(),B()和C()都被定义为不同的对象文件,只有包含您实际使用的符号的目标文件才会链接到程序中(除非它依赖于其他一个或多个,在这种情况下,链接器会找到满足这些引用的目标文件)同样,递归,直到它满足所有,或找到一个它不能满足(此时你会得到标准的“未解析的外部XXX”错误消息)。
最近,大多数编译器都可以将函数“打包”到单独的“模块”中,而无需将它们放入单独的源文件中来创建单独的目标文件。细节各不相同,但可以减少(或消除)使每个源文件尽可能小的必要性,以便将最终可执行文件中的内容保持在最低限度。
所以,底线:至少在大多数情况下,他是对的,你错了。
答案 1 :(得分:2)