![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
В общем, в последнее время часто приходится работать с программами на Си / C++.
В связи с этим хотелось бы нормальный компилятор. Сейчас пользуюсь DEV-CPP 4.9.8.0 и MSVC++ 6.0. Чем меня не устраивают оба этих компилятора - на примере adx2wave с моего сайта. DEV-CPP всем хорош, но использует msvcrt.dll, что меня несколько напрягает, размер .EXE - 14,336 байт. MSVC++ 6.0 - при включении опции оптимизации по размеру тоже начинает, гад, использовать msvcrt.dll, если её не включить - всё хорошо, использует только .DLL от ядра системы, но, увы, размером похвастаться не может - 40,960 байт. Поэтому хотелось бы спросить - существует ли нормальный компилятор (даже, скорее, линкер - т.к. скомпилировать, чтобы ошибок не было, могу и под другим компилятором), который: а) Не гадит в получаемый исходный файл лишней информацией (как MSVC). б) Не использует левые библиотеки, кроме .DLL ядра системы (как DEV-CPP). в) Генерирует небольшие по размеру исполняемые файлы. г) Ещё, было бы здорово, если бы он был Freeware'ный. Кто-нибудь знает - такое в природе существует? P.S. Блин, написал бы уже давно собственный компилятор для Delphi и C++, чем тем что есть пользоваться, но, увы, у меня нет такого дикого количества времени и сил... |
![]() ![]() |
Grom PE |
![]()
Сообщение
#2
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) ![]() |
А чем тебе не нравится msvcrt.dll? Она везде есть, начиная с Win98.
Тут волшебства не бывает, нет такого компилятора, который бы взял и сделал код меньше. Надо дать понять компилятору, что ты от него хочешь. С DEV-CPP (MingW) я толком не работал, а для MSVC знаю несколько ключей и директив. В командной строке: call cl /nologo /O1igab1 /G6Fy /Zp1 /QIfist <исходники> В главном исходнике: CODE #pragma optimize("gsy", on) #pragma comment(linker,"/section:.text,CERW /merge:.rdata=.text /ignore:4078") // Соединить секции, тут надо экспериментировать, при соединении некоторых секций EXE-шник раздувается #pragma comment(linker,"/opt:nowin98") // Использовать выравнивание секций в 512 байт, а не 4096 #pragma comment(linker,"/entry:main") // Обход внутренней стартовой функции, если программа не использует сишные функции, а только WinAPI #pragma comment(linker,"/subsystem:windows") // Или /subsystem:console, иногда без явного указания ругается #pragma comment(linker,"/nodefaultlib:libc") // Отключить стандартную сишную библиотеку #pragma comment(lib,"kernel32") // Подключить нужные библиотеки для WinAPI #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #define WIN32_LEAN_AND_MEAN // Иногда помогает уменьшить размер для WinAPI'шных прог. Хорошо еще пропатчить линкер, чтоб не пихал сигнатуру "Rich" в начале EXE-шника. Для версии link.exe 6.00.8447, размер 462901 байт: 00045826: 03 -> 90 00045827: C8 -> 90 Для других версий - находим такой код и меняем там 03C8 на 9090: CODE 03C8 add ecx,eax 898DE4010000 mov [ebp][000001E4],ecx FF1514114000 call _tzset;MSVCRT Если поставили "/entry:main", а программа использует командную строку в сишном стиле, то можно отдельно ее инициализировать: CODE __declspec(dllimport) void __getmainargs(int *,char ***,int *,int,int *); int main(int argc,char *argv[]) { ... { int tmp; __getmainargs(&argc,&argv,&tmp,0,&tmp); } ... } Спасибо сказали:
|
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 20:05 |