Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MSVC++;2010? 我有一些巨大的C++项目,所有的都是用MSVC++ + 2010编译的。 我希望DLL文件更小, 有人能给我一些启发吗?_C++_Visual C++_Compiler Construction - Fatal编程技术网

如何使用MSVC++;2010? 我有一些巨大的C++项目,所有的都是用MSVC++ + 2010编译的。 我希望DLL文件更小, 有人能给我一些启发吗?

如何使用MSVC++;2010? 我有一些巨大的C++项目,所有的都是用MSVC++ + 2010编译的。 我希望DLL文件更小, 有人能给我一些启发吗?,c++,visual-c++,compiler-construction,C++,Visual C++,Compiler Construction,编译发行版,使用链接时代码生成(LTCG),删除未使用的引用(OPT:ICF),将CRT放入DLL中。除非必要,否则不要从DLL中导出内容。除了上述建议之外,请确保在项目属性->C/C++->支持大小或速度中选择支持小代码(/Os)。除了其他答案之外,您还可以使用upx压缩DLL或其他压缩程序 编译为发行版,而不是调试版 动态链接MSVCRT,而不是静态链接。这意味着您可能必须随程序一起分发MSVCRT DLL。根据程序的结构,更改CRT的链接可能会产生意外的副作用 删除所有不需要的代码。使用

编译发行版,使用链接时代码生成(LTCG),删除未使用的引用(OPT:ICF),将CRT放入DLL中。除非必要,否则不要从DLL中导出内容。

除了上述建议之外,请确保在项目属性->C/C++->支持大小或速度中选择支持小代码(/Os)

除了其他答案之外,您还可以使用
upx
压缩DLL或其他压缩程序

  • 编译为发行版,而不是调试版

  • 动态链接MSVCRT,而不是静态链接。这意味着您可能必须随程序一起分发MSVCRT DLL。根据程序的结构,更改CRT的链接可能会产生意外的副作用

  • 删除所有不需要的代码。使用分析或代码覆盖率工具来识别似乎没有被调用的代码。您可能可以删除它

  • 查看每个.c或.cpp文件对应的所有.obj文件。如果任何一个obj文件相对于代码文件的大小过大,这可能是一个提示,可以在那里减少一些内容

  • 尽量减少DLL中全局实例或全局数据的使用。二进制大小将增加声明的全局变量的字节数

  • 只导出您需要导入其他EXE和DLL的最小数量的函数。运行“dumpbin/exports yourfile.dll”以获取导出函数的列表。仅导出依赖DLL的代码直接调用的函数。如果您正在导出DLL之外没有人会直接调用的内容,请不要导出它。如果没有内部调用链接器,链接器将优化它(及其依赖项)的使用

  • < P>不要导出整个C++类。如果DLL是C++代码,则导出简单的C包装器函数。
    链接到DLL运行时,并编译大小。如果仍然不够小,或者您不需要CRT DLL依赖项,请不要使用CRT。如果你有足够的创造力,Windows几乎可以提供你所需要的一切。当然,您的代码不会有丝毫的可移植性,但您可以用8KB的内存编写一台机器的代码。(第一句中的复数与第二句中的单数相矛盾,所以..到底是什么问题?)从DLL中删除所有代码和数据。。。并删除未使用的引用。这应该会让它变得很小。@你可能会提到,摆脱CRT将是一个很大的痛苦,用C做这件事比用C++更容易。