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

Why linking to a LIB significantly increases binary's size

本文关键字:二进制文件 增加 链接 LIB 为什么      更新时间:2023-10-16

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

如果我决定将该模块分解为一个主可执行文件和一个辅助LIB文件,精确计算我前面描述的N个对象,可执行文件的总体大小会保持不变吗?

我知道在链接过程中,编译器会决定LIB的哪些部分复制到可执行文件中,所以我希望可执行文件的总体大小小于或等于可执行文件。

我定义了LIB项目,它的大小优先于速度和最小大小(O1)。

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

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

可执行文件的总体大小一直保持在我调用原始对象的大小,怎么了?

静态库几乎在所有方面都只是对象模块的集合(将它们视为.obj.zip);对于链接器来说,无论是单独传递所有对象文件,还是将所有对象文件一起传递到静态库中,都没有真正的区别(如果可能的话,死函数消除是以相同的方式执行的),因此,无论是否使用中间库步骤,都会对可执行文件大小产生相同的影响,这是完全可以预料的。

您正向声明了类,但没有定义它,这实际上没有意义。如果它是在头文件中定义的,那么你不需要转发声明它。如果它是你正在创建的类,那么仅仅转发声明它是不够的。您需要定义类。你好像跨过了篱笆。

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

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

那么,它是Ramy库中定义的类,还是您自己创建的类?这取决于你的回答。

这是因为当您将程序与库链接时,会增加大小。该库包含函数,具体取决于主程序所需。

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