我正在开发一个非常大的项目,我需要在每次新的构建时将exe上传到某人,并且我的连接是通过电话调制解调器。
我想为运行代码的应用程序编译尽可能小的exe:MessageBox(0, "Hello", 0, MB_OK);
我正在使用Visual Studio 2010.到目前为止我的尝试:
版本0,尺寸和开关:
7kB(释放)
使用:\ O1
版本1,尺寸和开关:
3kB(释放)
使用:\ O1,关闭缓冲区安全检查,忽略默认库链接。
这可以做到甚至小于3kB吗?什么编译器标志会影响可执行文件的大小?
答案 0 :(得分:9)
动态链接CRT(即在代码生成选项中为CRT选择“多线程DLL”;应该是默认值)。选择尺寸优化。告诉链接器降低对齐要求(/ ALIGN和/OPT:NOWIN98,可以在项目配置对话框中的链接器选项下的命令行选项框中输入)(注意:这可能导致您的应用程序无法运行Windows版本。)
除此之外,您还可以使用打包程序,例如UPX,但请记住,如果某些防病毒工具无法成功分析其内容,则会错误地将打包的可执行文件检测为恶意软件。其他可用于Windows可执行文件的打包程序包括Crinkler和kkrunchy
即使没有打包器,您也可以做一些技巧,比如合并PE部分并将代码放在PE头中。通过这样做,您可以获得一个简单的“Hello world”MessageBox可执行文件,大约700字节左右(未压缩)。我不认为Visual C ++链接器支持这些操作。请参阅Tiny PE页面,了解如何手动完成此操作(他将其发挥到极致)。
答案 1 :(得分:3)
创建一个新的C ++ Win32项目,并选择空项目选项。
添加一个文件main.cpp,其中包含以下内容:
#include <Windows.h>
void HelloWorldMain()
{
MessageBox(0, L"Hello", 0, MB_OK);
}
在项目属性中,关闭缓冲区安全检查(C ++&gt;代码生成),忽略所有默认库(链接器&gt;输入),并将入口点(链接器&gt;高级)设置为HelloWorldMain。
构建发布配置;输出exe将是3K。
答案 2 :(得分:3)
#undef UNICODE
#define UNICODE
#include <windows.h>
void startup()
{
MessageBox( 0, L"Hello", L"Hi", MB_SETFOREGROUND );
ExitProcess( 0 );
}
[d:\dev\test] > cl foo.cpp kernel32.lib user32.lib /O2 /link /entry:startup /subsystem:windows foo.cpp [d:\dev\test] > dir foo.exe Volume in drive D is data Volume Serial Number is A875-F9FD Directory of d:\dev\test 09.08.2012 18:00 2 560 foo.exe 1 File(s) 2 560 bytes 0 Dir(s) 144 102 051 840 bytes free [d:\dev\test] > _
答案 3 :(得分:-3)
类似的东西:
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
MessageBox (NULL, "Hello, Windows 98!", "HelloMsg", MB_OK) ;
return 0 ;
}