为什么链接到LIB会显着增加二进制文件的大小

时间:2015-11-04 08:45:17

标签: c++ visual-studio static-libraries compiler-optimization static-linking

假设我有一个模块(DLL / EXE),用于定义具有N个对象的特定流,在编译/链接后,模块的大小为X.

如果我决定将该模块分解为主可执行文件和帮助程序LIB文件,准确计算前面描述的N个对象,那么可执行文件的整体大小是否会保持不变?

我知道在链接期间,编译器会将LIB的哪些部分复制到可执行文件中,因此我希望可执行文件的整体大小小于或等于可执行文件。

我已经定义了LIB项目,其大小超过速度和最小尺寸(O1)。

为了清除问题,我决定在LIB(全局函数)中实现一个小的HelloWorld函数,并从主可执行文件中删除对LIB对象的任何引用,并执行以下操作命令

#include "../LibObject/Function.h"
void main()
{
     HelloWorld();
}

可执行文件的整体大小仍然像我调用原始对象一样大小,怎么样?

3 个答案:

答案 0 :(得分:3)

静态库几乎只是所有对象模块的集合(将它们视为.zip的{​​{1}});链接器没有真正的区别,无论是单独传递所有目标文件还是在静态库中一起传递所有目标文件(如果可能,将以相同的方式执行死函数消除),因此您可以看到相同的效果有或没有中间库步骤的可执行文件大小是完全可以预期的。

答案 1 :(得分:1)

你正在向前宣布这个课程,但没有定义它并没有真正有意义。如果它在头文件中定义,那么您不需要转发声明它。如果它是你正在创建的一个类,那么只需要声明它是不够的。您需要定义类。你似乎跨越了篱笆。

    namespace Ramy{
    namespace TEST {
        namespace standard{
            class StandardAnalyzer;
        }
    }
}

是前方声明。它只是告诉编译器该类存在,它没有告诉编译器有关它的任何信息。编译器需要一个类定义。

那么,它是一个在Ramy库中定义的类,还是一个你自己创建的类?取决于你的答案。

这是因为当您将程序与库增加大小链接时。 该库包含主程序所需的功能,依赖性。

答案 2 :(得分:-4)

lib文件将始终增加可执行文件的大小,因为在调用.h文件时,您正在使用应用程序执行预处理器。