为什么链接到 LIB 会显著增加二进制文件的大小
Why linking to a LIB significantly increases binary's size
假设我有一个模块(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文件时,您正在使用应用程序执行预处理器。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 为什么链接到 LIB 会显著增加二进制文件的大小
- boost enable_shared_from_this特性是否给二进制文件增加了太多的大小?
- 包括boost函数.hpp,而不使用它,会使我的二进制文件的大小增加200k.为什么?