【发布时间】:2015-11-04 08:45:17
【问题描述】:
假设我有一个模块(DLL / EXE),它定义了具有 N 个对象的特定流程,编译/链接后,模块的大小为 X。
如果我决定将该模块分解为一个主可执行文件和一个辅助 LIB 文件,并准确计算我之前描述的 N 个对象,那么可执行文件的整体大小会保持不变吗?
我知道在链接期间,编译器决定将 LIB 的哪些部分复制到可执行文件中,所以我希望可执行文件的整体大小小于或等于可执行文件。
我已将 LIB 项目定义为优先大小而不是速度和最小大小 (O1)。
为了清楚起见,我决定在 LIB(全局函数)中实现一个小 HelloWorld 函数,并从主可执行文件中删除对 LIB 对象的任何引用,并执行以下命令
#include "../LibObject/Function.h"
void main()
{
HelloWorld();
}
可执行文件的整体大小一直保持在我调用原始对象时的大小,怎么样?
【问题讨论】:
-
您是否在问为什么当您将一些东西移入静态库时您的可执行文件没有变小?如果是这样……为什么会这样?为什么链接器能够从库中删除比从普通目标文件中更多的代码?
-
另外,您的问题标题是“为什么二进制大小会增加”,而实际问题似乎是在问“为什么二进制大小不会变小”。虽然这些不是相互排斥的,但您能澄清一下吗?
-
现在在 DLL 中的代码必须链接到 EXE。所以当然EXE永远不会变小。最好的希望是 EXE 将小于原始 EXE 和 DLL 的组合大小。
-
@melak47,我会同意你的第二种解释,我认为整体大小最终会减小。如果我使用库中的单个全局函数而不是主对象,它的长度应该减少。
标签: c++ visual-studio static-libraries compiler-optimization static-linking