Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
减少可执行文件大小-注释掉调用/使用与删除文件/文件夹 我的目标是减少现有VisualStudio 2013 C++项目的二进制大小。_C++_C++11_Dll_Linker - Fatal编程技术网

减少可执行文件大小-注释掉调用/使用与删除文件/文件夹 我的目标是减少现有VisualStudio 2013 C++项目的二进制大小。

减少可执行文件大小-注释掉调用/使用与删除文件/文件夹 我的目标是减少现有VisualStudio 2013 C++项目的二进制大小。,c++,c++11,dll,linker,C++,C++11,Dll,Linker,正如我在上一篇半相关文章中所理解的,链接器将在二进制文件中包含代码片段,只有在使用代码的情况下 为了确定项目中哪些组件类/文件夹/过滤器最大,我尝试了以下方法: 注释掉这些组件的调用/使用。 1+从我的项目中完全删除这些组件文件/文件夹。 我期望2在二进制大小方面给出与1相同的结果。 不过发现使用2号对尺寸的影响更大,这意味着缩小尺寸更好 问题 我的假设有效吗?2给出的结果与1相同吗? 如果是这样,为什么我得不到预期的结果? 更新1 链接器似乎仍然包含未使用函数的代码,好像它的逻辑告诉它不能排除

正如我在上一篇半相关文章中所理解的,链接器将在二进制文件中包含代码片段,只有在使用代码的情况下

为了确定项目中哪些组件类/文件夹/过滤器最大,我尝试了以下方法:

注释掉这些组件的调用/使用。 1+从我的项目中完全删除这些组件文件/文件夹。 我期望2在二进制大小方面给出与1相同的结果。 不过发现使用2号对尺寸的影响更大,这意味着缩小尺寸更好

问题 我的假设有效吗?2给出的结果与1相同吗? 如果是这样,为什么我得不到预期的结果? 更新1 链接器似乎仍然包含未使用函数的代码,好像它的逻辑告诉它不能排除这些函数,因为它们可能会以某种方式使用,例如:导出函数 提醒一下,我希望排除的函数/类没有导出

例1

生成大小约300KB的DLL

例2

生成的DLL大小约为400KB

问题: 生成DLL时,如果函数未使用/调用且未导出,为什么链接器会包含其代码


我根据

配置了链接器标志,如果您举个例子的话,这会更容易。@Yakk在发行版中编译和优化标志更倾向于大小而不是速度。这更多的是一个链接器在DLL中包含哪些代码的问题,以及为什么要解决我的问题。我的意思是传递给编译器的每个标志。我确信提供所有信息更有用,但为了这个问题,我应该关注特定标志吗?根据二进制文件的大小,您是指.exe文件的大小还是内存中进程映像的大小?
void func(HINSTANCE, LPVOID lpReserved)
{
   // do nothing
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
   // do nothing
}
void func(HINSTANCE, LPVOID lpReserved)
{
   // do something huge
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
   // do nothing
}