★★★★★★★★★ 如何才能使vc编译链接成的程序体积小于24k?

叁哥_ 2004-08-04 10:10:24
小弟用VC新建了一个 Win32 applicatio empty project

        加入必要代码(winmain、winproc、msg循环)

        然后在工程设置里选择了 代码最小体积

        为什么编译链接后的release版程序还是有 24k?

        用Dev-c++等编译出这个的程序只有3k!

        如何能使vc编译链接出的程序小于24k?请各位大侠赐教!

        不胜感激!
...全文
251 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
叁哥_ 2004-08-09
明白了~


谢谢各位!
回复
rivershan 2004-08-07
see MSJ 1996 October Under the hood
回复
Zark 2004-08-06
"不是, WinMainCRTStarup 就是入口函数, 应该是它被 WinMain 调用 ."

这句话有问题,应该是WinMainCRTStarup调用WainMain.

回复
prettywolf 2004-08-06
//题目:怎样使用 Visual C++ 编译出只有 1536 字节的窗口程序
//这些技巧都是dREAMtHEATER老大哥告我的……
//编译出来后,文件大小为: 1536 字节


////////////////////////////////////////////////////////////////////////////////////////////////////
//预处理
#include <Windows.h>
#include "stdafx.h"
//使用了下面的预处理,编译连接时必须是 Release 方式,否则不能通过


//自定义程序入口,如果要优化,推荐使用这个
//如果使用 VS.NET,也可以这样设置:在“解决方案管理器”里选定项目,右击,选择“属性”->“链接器”->“高级”->“入口点”
//VC 6里面也有类似的设置,但具体不记得了
//项目属性的其它设置可以仔细看看,其它优化也都在这里可以设置
#pragma comment(linker, "/ENTRY:EntryPoint")


//下面是调整段对齐,默认是 4K,在 Win98 下能更快地装入 PE 文件,但会增加 PE 文件的大小
//下面这一行在这里好像会说是“无效的指令”什么的,故在这里也注释掉了,也许是段太小的原因吧。
//直接在工程选项里面设置:项目“属性”->“链接器”->“优化”->“Windows98 优化”->“否 (/OPT:NOWIN98)”
//#pragma comment(linker, "/OPT:NOWIN98")


//下面的优化是段合并,不推荐使用,在很多程序里也许也许不能使用
#pragma comment(linker, "/SECTION:MiniPE,") //创建自定义的 MiniPE Section
#pragma comment(linker, "/MERGE:.data=MiniPE") //合并.data Section 到 MiniPE Section
#pragma comment(linker, "/MERGE:.text=MiniPE") //合并.text Section 到 MiniPE Section
#pragma comment(linker, "/MERGE:.rdata=MiniPE") //合并.rdata Section 到 MiniPE Section
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
//全局变量
HWND g_hWnd; //主窗口句柄,一般程序中经常用到此变量,故使用全局变量
HINSTANCE g_hInst; //应用程序进程句柄,一般程序中经常用到此变量,故使用全局变量

const char c_szAppName[] = "MiniPE";
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
//函数声明
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow);
////////////////////////////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////////////////////////////
//入口函数
//使用我们自己的入口函数,而不用连接器默认提供的一大堆程序初始化操作的代码
//为了在一个普通的 Win32SDK 程序里能使用这种方法,下面的函数将调用 WinMain() 函数,并给出相应的参数
void EntryPoint()
{
ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL));
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
//主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
MSG sMsg;
WNDCLASSEX sWndClassEx;


g_hInst = hInstance;

sWndClassEx.cbSize = sizeof(WNDCLASSEX);
sWndClassEx.style = CS_VREDRAW | CS_HREDRAW;
sWndClassEx.lpfnWndProc = (WNDPROC) WindowProc;
sWndClassEx.cbClsExtra = 0;
sWndClassEx.cbWndExtra = 0;
sWndClassEx.hInstance = g_hInst;
sWndClassEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
sWndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
sWndClassEx.hbrBackground = (HBRUSH) (COLOR_WINDOW);
sWndClassEx.lpszMenuName = NULL;
sWndClassEx.lpszClassName = c_szAppName;
sWndClassEx.hIconSm = NULL;
RegisterClassEx(&sWndClassEx);

g_hWnd = CreateWindowEx(0, c_szAppName, c_szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, g_hInst, NULL);
ShowWindow(g_hWnd, iCmdShow);
UpdateWindow(g_hWnd);

while (GetMessage(&sMsg, NULL, 0, 0))
{
TranslateMessage(&sMsg);
DispatchMessage(&sMsg);
}
return((int) sMsg.wParam);
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
//主窗口回调函数
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return(DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return(0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
回复
王国凡 2004-08-06
回复人: TempterX(兄弟) ( ) 信誉:98 2004-08-05 20:19:00 得分: 0


任何C编译器都是会生成类似WinMainCRTStarup的入口函数的吧?
然后在WinMainCRTStarup中调用WinMain是不是?


====================================
不是, WinMainCRTStarup 就是入口函数, 应该是它被 WinMain 调用 .
回复
aganpro 2004-08-06
如果一定要做小于24k的程序的话,汇编嘛!
回复
叁哥_ 2004-08-06
up
回复
i_noname 2004-08-05
windows.h其实包含了好多个头文件。
为什么一定要程序小于24K呢?没什么必要。
回复
叁哥_ 2004-08-05
我建的是空工程!只用了<windows.h>一个头文件!
回复
王国凡 2004-08-05
...缺省设置下编译一个很简单的 Win32 Application 工程, release 模式二进制可执行文件大小也会有 24 kb, 它导入了 36 个 Win32 API 函数, 虽然你可能只用到了一两个或者没有用到, 有近 3000 字节的初始化全局数据, 虽然程序并不直接使用其中的任意一个, 你会发现程序的起点不是 WinMain , 而是 WinMainCRTStarup ...

所以, 你要编写更小的,就要自己实现 WinMainCRTStartup .

可以参看《Windows 图形编程》第 1 章, 一个程序可以只有 1.5 kb 的 .
回复
叁哥_ 2004-08-05
任何C编译器都是会生成类似WinMainCRTStarup的入口函数的吧?
然后在WinMainCRTStarup中调用WinMain是不是?
回复
DoubleJiang 2004-08-05
我link的36k
回复
iCoder_Me 2004-08-05
mark
回复
叁哥_ 2004-08-05


都是C++编译器,为什么vc编译出来要大那么多呢?
回复
无敌魔仙 2004-08-04
把一些没用到的头文件和库文件都去掉,再编译看看,我真的没有想过一定要让程序小于24K过
回复
真如实观 2004-08-04
不用mfc
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-04 10:10
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……