我有一些巨大的 c++ 项目,所有这些都是用 msvc++ 2010 编译的。我希望 DLL 文件更小, 谁能给我一些启发?
4 回答
编译发布,使用链接时间代码生成 (LTCG),删除未使用的引用 (OPT:ICF),将 CRT 放入 DLL。除非必要,否则不要从 DLL 中导出内容。
除了其他答案之外,您还可以使用upx
压缩 dll 或其他一些压缩器。
除了以上建议,确保在Project Properties->C/C++->Favor Size Or Speed中,选择Favor small code (/Os)。
编译为发布,而不是调试。
与 MSVCRT 动态链接而不是静态链接。这意味着您可能必须将 MSVCRT DLL 与您的程序一起分发。根据程序的结构,更改 CRT 的链接可能会产生意想不到的副作用。
删除所有不需要的代码。使用分析或代码覆盖工具来识别似乎没有被调用的代码。您也许可以将其删除。
查看每个 .c 或 .cpp 文件的所有对应 .obj 文件。如果任何一个 obj 文件相对于代码文件的大小来说过大,那可能是暗示可以在那里减少一些东西。
尽量减少在 DLL 中使用全局实例或全局数据。二进制大小将因声明的全局变量的字节数而膨胀。
仅导出导入其他 EXE 和 DLL 所需的极少数量的函数。运行“dumpbin /exports yourfile.dll”以获取导出函数的列表。仅导出依赖 DLL 的代码直接调用的函数。如果您要导出 DLL 之外的任何人都不会直接调用的内容,请不要导出它。如果没有内部调用它,链接器将优化它(及其依赖项)以防止被使用。
不要导出整个 C++ 类。如果您的 DLL 是 C++ 代码,则导出简单的 C 包装函数。