IPB

Добро пожаловать, гость ( Вход | Регистрация )

> Нужен нормальный C/C++ компилятор
-=CHE@TER=-
Aug 6 2008, 11:07
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



В общем, в последнее время часто приходится работать с программами на Си / 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++, чем тем что есть пользоваться, но, увы, у меня нет такого дикого количества времени и сил...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
Grom PE
Aug 7 2008, 00:07
Сообщение #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);
  }
  ...
}


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 17th June 2024 - 22:47