Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 59
1

Как написать и скомпилировать программу так, чтобы exe весил от 50 до 300 кб...?

13.06.2011, 22:29. Просмотров 2730. Ответов 18
Метки нет (Все метки)

Всем доброго времени суток
Тема встречается часто, но никто не дает внятного ответа на вопрос:
Как написать и скомпилировать программу так, чтобы exe весил от 50 до 300 кб...?
Речь соответственно идет о простых программках, с использованием стандартных компонентов. Например: Image, button, edit

Долгое время я писал на Delphi, но проекты в 700 кб из ничего, стали раздражать.
Я скачал С++ Builder XE и написал тоже самое в нем, размер Debug версии всего 135кб, но Realese аж 1,2 мб - я был очень расстроен.

Очень прошу совета, в какой среде программирования лучше писать в плане маленьких exe и какой ЯП выбрать?
С++ или Delphi
Мне говорили, что на C# в итоге выходят exe маленькие, это так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2011, 22:29
Ответы с готовыми решениями:

Написать программу так, чтобы exe весил менее 2 килобайт
Помогите написать спираль на паскале,чтобы экзешник весил меньше 2 килобайт!! У меня много...

Как сделать так чтобы файл на жестком диске и на дискете 1.44 мб весил одинаково
Как сделать так чтобы файл на жестком диске и на дискете 1.44 мб весил одинаково.(мы работаем через...

Как скомпилировать программу в формат exe?
У меня на компьютере спокойно запускаются все мои проекты, а вот когда запускают друзья у них...

Как скомпилировать CLR программу в статический .exe?
Подскажите как скомпелировать CLR программу в статический .exe? Пробовал компелировать...

18
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
13.06.2011, 22:33 2
Есть программы, которые сжимают другие программы, например UPX
Подробнее тут
0
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 59
13.06.2011, 22:37  [ТС] 3
Цитата Сообщение от iama Посмотреть сообщение
Есть программы, которые сжимают другие программы, например UPX
Подробнее тут
Пробовал сжать 1,2 метра от С++ Builder XE, вышло 450кб, все равно много
0
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
13.06.2011, 22:38 4
lamer811, а сколько ж вам надо-то? Нужно меньше - переписывайте на асм.
0
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 59
13.06.2011, 22:44  [ТС] 5
Цитата Сообщение от iama Посмотреть сообщение
lamer811, а сколько ж вам надо-то? Нужно меньше - переписывайте на асм.
Я в заголовке темы написал
Как написать и скомпилировать программу так, чтобы exe весил от 50 до 300 кб...?
20 строчек кода + 1 Image + 1 button + 1 edit весят аж 1,2 метра... Это же много

Чтобы писать на асме, его нужно знать, а я знаю только С++ и Delphi

Добавлено через 57 секунд

iama а какие по весу у вас проекты выходят?
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
13.06.2011, 22:49 6
lamer811, у вас жесткий диск на 20 мб стоит?
Пишите на WinApi, библиотеки отдельно от *.exe файла таскайте.
0
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
13.06.2011, 22:49 7
Цитата Сообщение от lamer811 Посмотреть сообщение
а какие по весу у вас проекты выходят?
Если готовый дистрибутив весит 20мб - никого это не смущает. А в чем у вас проблемма? Инет слабый?
0
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 59
13.06.2011, 22:55  [ТС] 8
Цитата Сообщение от Nouko Посмотреть сообщение
lamer811, у вас жесткий диск на 20 мб стоит?
Пишите на WinApi, библиотеки отдельно от *.exe файла таскайте.
Да причем тут жесткий диск
Я спрашиваю как? А мне все говорят зачем?
Потому что не дело, 20 строк в 1,5 метра


Про WinApi все только говорят, а пишут единицы
0
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
13.06.2011, 22:57 9
lamer811, ну можно писать на MS VC++, чистом винапи, только это муторно. А в чем смысл-то, зачем вам такой маленький вес?
0
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 59
13.06.2011, 23:01  [ТС] 10
Цитата Сообщение от iama Посмотреть сообщение
lamer811, ну можно писать на MS VC++, чистом винапи, только это муторно. А в чем смысл-то, зачем вам такой маленький вес?
Последнее время много людей начинает смеяться, над маленьким софтом с размером мусорного ведра, вот я и хочу понять, как сделать меньше
0
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
13.06.2011, 23:04 11
Чтобы над вами смеялись?
0
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 59
13.06.2011, 23:06  [ТС] 12
Цитата Сообщение от iama Посмотреть сообщение
Чтобы над вами смеялись?
Чтобы знать! Я стремлюсь к знаниям...

А у всех на языке только:
1) ASM
2) Win Api
Это поколение Кэпов
0
648 / 459 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
13.06.2011, 23:09 13
Вам уже ответили что нужно делать для уменьшения веса. Садитесь гуглите и учите.
0
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 59
13.06.2011, 23:12  [ТС] 14
Цитата Сообщение от Nouko Посмотреть сообщение
Вам уже ответили что нужно делать для уменьшения веса. Садитесь гуглите и учите.
Это я и без форума знал
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
13.06.2011, 23:34 15
с VCL у тебя программа меньше не будет, выход - отказываться от VCL и использовать прямые вызовы к библиотекам ОС - в винде это WinAPI. Писать на WinAPI не так уж трудно, просто код выходит длинный очень. В Visual Studio есть тип проекта, который сам создает некоторое количество кода на WinApi (создание окна и цикл обработки сообщений), т.е. писать уже надо меньше. Надо садиться и пробовать - через пару недель будешь уже норм разбираться. Проекты будут весить пару килобайт и без лишних библиотек. Меньше уже не будет нигде
0
517 / 305 / 58
Регистрация: 30.07.2008
Сообщений: 607
13.06.2011, 23:54 16
но сами посудите, какие такие 20 строчек когда!
если нужно нарисовать форму, нарисовать кнопки, сделать действия для них, для image алгоритм чтения... оч много получается

Вы используете VCL (Visual Component Libarry) (библиотека визуальных компонентов) а она за собой таскает помимо TButton TForm, еще и TScrollBar, TMemo... и еще кучу удобных готовых компонентов

если нужно писать мизерные приложения, то нужно использовать стандартные библиотеки или на WinAPI писать.

Не по теме:

кстати с++ тут вообще не причем, на чистом с++ приложения и получаются маленькими



ЗЫ:


Цитата Сообщение от lamer811 Посмотреть сообщение
...Как написать и скомпилировать программу так, чтобы exe весил от 50 до 300 кб...?...
Используйте DLL
0
Эксперт С++
3056 / 1398 / 421
Регистрация: 19.01.2009
Сообщений: 3,763
14.06.2011, 10:51 17
Цитата Сообщение от lamer811 Посмотреть сообщение
Мне говорили, что на C# в итоге выходят exe маленькие, это так?
Да это действительно так, особенно если сравнивать с Delphi и C++ Builder'ом. Как-то я написал программку (небольшой генератор паролей) с одинаковым функционалом используя Delphi, Qt, Gtk+, C# и WinAPI. Их размеры можно посмотреть на приаттаченом рисунке.
0
Изображения
 
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
14.06.2011, 12:07 18
schdub, ага, только ты не учел сколько весит виртуальная машина .NET, а без нее работать не будет, и да, есть компы на которых не стоит .NET framework
0
Заблокирован
15.06.2011, 15:54 19
-LeV-, все он учел, в первом посте четко сказано
Цитата Сообщение от lamer811 Посмотреть сообщение
чтобы exe весил от 50 до 300 кб...?
с Qt тоже библиотеки весят в районе 10 Мб для самой простой программы.
ближе к теме: (цитата не знаю откуда, у меня на диске валяется уже пару лет)
большая цитата
Пишем свою точку входа в программу.

Точка входа в программу, это то место, откуда процессор начнет выполнение программы. Те, кто кодировал на асме знают о директиве .startup, вот это и есть точка входа. На асме часто приходилось извращаться с переносом стартапа в конец программы при помощи всяких jmp, те кто кодил, знают

Так вот, зачем писать свою точку входа в программу и почему вы раньше не задумывались над этим? Наверное не знали что имеете такую возможность - переопределить это дело. Да, имеете, линкер позволяет 8))

Я всегда использую в качестве точки входа в программу свою ф-цию WinMain, это функция, с которой обычно начинается выполнение программы на C++ под виндовс. Так вот, как переопределить точку входа, заменив своей и сэкономить на этом пару десятков килобайт, которые идут на вызов всяких стандартных либ и прочего хлама:
#pragma comment(linker,"/MERGE:.rdata=.text")
// /MERGE:.rdata=.text - указываем линкеру, что нужно скомбинировать секцию .rdata с .text
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
// /FILEALIGN:512 - указываем что следует использовать 512-и байтовое выравнивание и размер
// секции в исполняемом модуле, посмотрите с помощью тулзы DUMPBIN каково значение у программ,
// которые вы писали это этого )
// /SECTION:.text,EWRX :
// указываем что у нас есть одна секция .text, в которую мы ранее переместили .rdata
// задаем ей атрибуты EWRX:
// E данный section поддерживает выполнение кода, Executable короче говоря
// R разрешает операции чтения
// W разрешает операции записи
// X используется при написании резидентов и VxD дров )
// маркирует секцию как участок памяти
#pragma comment(linker,"/ENTRY:WinMain")
// ну и тут вся ясно - задаем нашу точку входа, о которой говорили выше.
// вот так выглядит WinMain 8)
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR argv, int)
{
// there your code...
};

еще советую линковать вашу программу с опциями:

/O1 - оптимизация в пользу уменьшения размера кода /Os - тоже самое... /OPT:NOWIN98 -отключает оптимизацию под мастдай, это не значит что программа под мастдаем не будет выполнятся а под NT будет, просто вроде как медленнее, но вы этого не заметите, уверяю вас 8))

эти опции поддерживает Visual C++
Используйте только API-шные функции.

Весь предыдущий геммор с точкой входа сводится на нет, если вы в своей программе будете использовать функции из стандартных библиотек, которые мы отрубили задавая свою точку входа. в C++ это все RTL-овские ф-ции, к примеру часто приходится обрабатывать строки, для этого все используют функции str* (strlen, strstr, strtok, strcmp, etc...) так вот, здесь это не прокатит 8)) существуют сепцовые api-шные функции для работы с строками типа char*:

lstrcat
lstrcpm
lstrstr
lstrlen

и т.п... жаль что нет аналога одной весьма полезной функции strtok, которая весьма была бы полезна при разборе параметров командной строки, получаемых с использованием GetCommandLine(), которая возвращает всего лишь указатель на строку, а разгребать ее придется самому. Правда есть спецовая функция, которая вернет нам параметры в виде массива, но там будут строки UNICODE, то есть с 16-байтовыми символами. Если вас это устраивает - вам проще 8))

Также придется отказаться от всеми любимых printf/scanf 8((, очень нелегко пришлось переходить на WriteConsole/ReadConsole 8))
Узкие места в программе. Ассемблерные вставки и системное программирование.

Использование асмовых вставок - дело неблагодарное 8) Или пишите на win32-asm'e или... Это не придаст желаемого результата, разве что написанные целые функции на асме, но это на любителя. Одно, в чем асм нам помогает в паре с С++ - работа с регистрами и флагами процессора, особенно когда нужно сохранить и потом восстановить указатель ip/eip )

Также асмовые вставки хороши когда в программе имеются так называемые "узкие места", то есть критически важные операции, их конечно же лучше писать на асме. НО! Был случай, когда удалось найти эквивалентные ф-ции, выполняемые атомарно, то есть исключен вариант что в процессе выполнения функции доставки вашей подружкой пива с магазина к вам домой девушка не донесет пиво и выпьет его 8) Атомарные функции выполняются атомарно, то есть исключен вариант когда функция не успеет выполнить определенные операции и будет прервана системой. Потому они и названы атомарными, от слова АТОМ - то есть НЕДЕЛИМЫЙ.

К узким местам в программе можно отнести куски кода и данные, которые могу одновременно использоваться различными процессами и потоками, для этого придуманы объекты CRITICAL_SECTION, объекты помогаемые защитить разделяемые переменные.

огромный эффект дает уже задание своей точки входа

Приложения со всякими кнопками, полями ввода вполне умещаются в 4-6 Кб
Но, конечно, неудобно бывает, т.к. приходится отказываться от стандартных библиотек.

Цитата Сообщение от iama Посмотреть сообщение
Чтобы над вами смеялись?
надо перечитать сообщение выше:
Цитата Сообщение от lamer811 Посмотреть сообщение
начинает смеяться, над маленьким софтом с размером мусорного ведра
под мусорным ведром имеется ввиду большой размер, под маленьким софтом - простая программа.

Еще, если используете gcc - то обратите внимание на strip, он удаляет отладочную информацию, размер файла существенно уменьшится.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2011, 15:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как скомпилировать программу в один exe файл
Здравствуйте, скажите я новичек в VB нужно что-бы программа скомпилировалась в один запускаемый...

Как скомпилировать программу на VB, чтобы не проверяла на наличие .NET?
1. Как скомпилировать прогламму на VB, чтобы при запуске на рабочих станциях(где не установлен...

Как скомпилировать программу на XE8 чтобы запускалась на любом компьютере ?
Как скомпилировать программу на XE8 чтобы запускалась на любом компьютере ?

Как скомпилировать программу в с++ builder чтобы не было конфликтов с подключением БД на другом ПК?
Вопрос такой я уже задавал, но проблема так и не была решена. Мне предлагали такое решение: ...

Написать программу построения графика функции f(x) так,чтобы
Написать программу построения графика функции f(x) так,чтобы участки графика,на которых f(x)< 0 и...

Как сделать так, чтобы запуск из *.exe не вылетал!
Из командной строки все работает нормально, но запуск файла *.exe (этот файл я сам создовал, он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.