[ Predrag Damnjanovic @ 30.03.2002. 11:22 ] @
Najmanji EXE koji sam uspeo da napravim sa VC++ 6.0 je 24kb.
Kompresovano sa UPX ispadne oko 9 kb.
Uspeo li je neko da napravi manji EXE od 24kb?
[ Ivan Dimkovic @ 30.03.2002. 12:39 ] @
Evo, ja sam upravo napravio EXE od 16 KB koji kad se spakuje UPXom ima 2 KB

Trik je da ne koristis CRT biblioteku - mada je meni ovo u kontekstu pisanja Win32 korisnickih programa potpuno besmisleno.


MSVC moze stvarno praviti male programe, secam se da sam 1997 napravio 3D intro za DOS, koji je imao 4k, a pisan je u C-u sa inline assemblerom. Sam source fajl je bio oko 25 KB, a kad se prevede i kompresuje PKLITEom imao je 4KB. Intro je imao 3D engine (transformaciju vektora, sencenje i osvetljenje) - prostu rotaciju i blur out + pikselizaciju na kraju. Sam objekat je imao oko 150-200 trouglova, ne secam se tacno.

Naravno, intro nije koristio CRT library, cak ni startup (crt0.asm) - ali se kompajlirao sa MSVC-om, i koristio sve prednosti C-a. Floating point se nije koristio, vec je koriscena fixed point algebra zbog brzine (intro je radjen na 486 DX4 na 133 MHz)
[ Predrag Damnjanovic @ 30.03.2002. 12:51 ] @
Kako se iskljucuje ta CTR biblioteka, i sta time gubim?
[ Ivan Dimkovic @ 30.03.2002. 12:56 ] @
Pa ne koristis ANSI-C funkcije (printf, scanf, getc, itd...)

A u procesu linkovanja stavis /NODEFAULTLIBRARY

Takodje, i /ENTRY:neka_tvoja_funkcija_koja_nije_main

Gubis dosta toga, sve usluge CRT biblioteke viseg nivoa (operacije sa stringovima, fajlovima, itd)

Naravno, uvek mozes pozivati Win32 ekvivalente (u mom primeru MessageBoxA) kojih ima sasvim dovoljno.

Prednost ovoga je sto u 20-30 KB (tj. spakovanih 10-20 KB) mozes smestiti neki OpenGL/Direct3D applet za Internet koji bi se trenutno ucitavao. Sve zavisi sta hoces da uradis.
[ Predrag Damnjanovic @ 30.03.2002. 13:13 ] @
A aplikacija ne mora da bude konzolna?
[ Predrag Damnjanovic @ 30.03.2002. 13:27 ] @
Kad mu iskljucim default library, javlja ovo:

Linking...
LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
Release/go1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Nisi mi rek'o kako da iskljucim taj CRT?
Inace, pokusavam da iskompajliram ne-konzolnu aplikaciju.
[ Ivan Dimkovic @ 30.03.2002. 13:53 ] @
Ne mora da bude konzolna aplikacija

cl moj_mali_program.c /c

link /NOD /ENTRY:moj_entry_poing /SUBSYSTEM:WINDOWS user32.lib gdi32.lib kernel32.lib


/SUBSYSTEM:[CONSOLE | WINDOWS | NATIVE | POSIX]

[ Predrag Damnjanovic @ 30.03.2002. 15:21 ] @
Hvala, radi!
Mada me posteno namuci sa /entry, trebalo mi 15 minuta da ukapiram da trebam da stavim main
[ Dragi Tata @ 30.03.2002. 16:48 ] @
Citat:
Ivan Dimkovic:

Gubis dosta toga, sve usluge CRT biblioteke viseg nivoa (operacije sa stringovima, fajlovima, itd)

Naravno, uvek mozes pozivati Win32 ekvivalente (u mom primeru MessageBoxA) kojih ima sasvim dovoljno.

Prednost ovoga je sto u 20-30 KB (tj. spakovanih 10-20 KB) mozes smestiti neki OpenGL/Direct3D applet za Internet koji bi se trenutno ucitavao. Sve zavisi sta hoces da uradis.


CRT je neophodan ako hoćeš da praviš portabilne programe (ISO C/C++). A ako si već rešio da se vežeš za Win, može sasvim lepo i bez njega. ATL projekti po default-u izbace CRT.

A nije loša ideja ni da se program dinamički linkuje sa CRT-om. Tada možeš da koristiš sve standardne funkcije i opet dobiješ "mali" exe.
[ Milan Aksic @ 30.03.2002. 17:34 ] @
D.T. kako bi moglo da se izvede da se program dinamicki linkuje sa CRT-om ?
[ Ivan Dimkovic @ 30.03.2002. 17:39 ] @
Koristis MSVCRT.lib

tj. -MD switch (cl.exe)

ili odgovarajucu opciju u "Project Options" u MSVC++
[ Predrag Damnjanovic @ 30.03.2002. 23:14 ] @
Evo sta je stalo u 3kb
[ Ivan Dimkovic @ 04.04.2002. 14:04 ] @
Baci pogled na 4k introe da vidis sta sve stane u 4 KB... :)