gcc + console = 256512 byte
От: Аноним  
Дата: 26.05.06 07:09
Оценка:
Уважаемые!
Не подскажите, как заставить gcc делать не такое здоровое консольное приложение. Если компилю WindowsGUI, то размер нормальный. А вот консольные приложения- ужас! Поскажите лечение данной проблемы!
Спасибо.
Re: gcc + console = 256512 byte
От: Lab74  
Дата: 29.05.06 18:58
Оценка:
1. В опциях компилятора
— отключить генерацию отладочной информации (generate debugging information),
— включить strip executable.

2. Использовать C библиотеки вместо C++.

Например, этот код у меня (wxDevCpp / MinGW) компилируется в 5.632 байт:
#include <stdio.h>
int main()
{
  printf("Hello World!\n");
  getchar();
}


А этот — в 266.240 байт:
#include <iostream>
using namespace std;
int main()
{
  cout << "Hello, world!\n";
  getchar();
}


Если оставаться в рамках C++, то приемлемого решения с GCC / MinGW я не вижу. Только пробовать другой компилятор. Borland C++ 5.5 (BCC32), например, справляется уже заметно лучше. Второй пример превращается в 113.152 байт. Надо еще посмотреть, какие у него там установки по умолчанию, может еще меньше можно сделать.

Можешь еще здесь посмотреть:

Reasons for 'large' objects, libraries and executables
http://mingw.org/MinGWiki/index.php/executables%20large

GNU C vs BCC — huge output file
http://groups.google.com/group/gnu.g++.help/browse_thread/thread/d3c5f95aa54f94ff/b672b9c7a3467bc2


Надеюсь, откликнутся еще более опытные коллеги. У меня самого пока очень поверхностное представление о C++.

Ну и свой код приведи, что ли.
Re[2]: gcc + console = 256512 byte
От: Аноним  
Дата: 29.05.06 21:36
Оценка:
Код приводить смысла нет- он такой же как и вышеприведённый.

Компилю из CodeBlocks. Получается 257000 (примерно). Ключи для минимального размера установил. Никакой дебаг-инфо и т.п.
strip.exe не уменьшает размер ни на байт.

Где-то слышал, что вместо статической линковки стандартной библиотеки можно прикрутить msvcrt.dll. Только как?
Re[3]: gcc + console = 256512 byte
От: Sheridan Россия  
Дата: 30.05.06 06:09
Оценка:
Попробуй флаг -Os

[RSDN@Home][1.2.0][alpha][651]
[Hеподражаемое как раз и вызывает большинство подражателей. [Мария Эшенбах]]
Matrix has you...
Re[3]: gcc + console = 256512 byte
От: Lab74  
Дата: 30.05.06 07:44
Оценка:
A>strip.exe не уменьшает размер ни на байт.
Значит уже компилируется с параметром -s (передается линкеру через компилятор)

А>Где-то слышал, что вместо статической линковки стандартной библиотеки можно прикрутить msvcrt.dll. Только как?


да он и так линкуется (посмотри зависимости в exe). Только вот, насколько я понимаю, внутри msvcrt.dll находятся только C библиотеки, а iostream и прочих от C++ там нет. Может, внутри msvcp**.dll есть?

Видимо GCC вставляет iostream целиком в EXE, что и приводит к резкому разбуханию файла. Другие компиляторы, наверное, умеют разбить эту библиотеку на части и вставить только то, что действительно нужно.

Во всяком случае, BCC32 не линкует никакие внешние C/C++ библиотеки, т.е. у него iostream тоже находится внутри результирующего exe, но в более компактном виде. Кстати, в случае чистого C это приводит к большему размеру EXE — где то от 50 kb — по сравнению с GCC, но в принципе должно обеспечивать бОльшую стабильность (т.к. независим от версии msvcrt.dll).

Вот еще цитата:

http://www.parashift.com/c++-faq-lite/class-libraries.html#faq-37.8


[37.8] Why is my executable so large?

Many people are surprised by how big executables are, especially if the source code is trivial. For example, a simple "hello world" program can generate an executable that is larger than most people expect (40+K bytes).

One reason executables can be large is that portions of the C++ runtime library might get statically linked with your program. How much gets linked in depends on compiler options regarding whether to statically or dynamically link the standard libraries, on how much of it you are using, and on how the implementer split up the library into pieces. For example, the <iostream> library is quite large, and consists of numerous classes and virtual functions. Using any part of it might pull in nearly all of the <iostream> code as a result of the interdependencies (however there might be a compiler option to dynamically link these classes, in which case your program might be small).

Another reason executables can be large is if you have turned on debugging (again via a compiler option). In at least one well known compiler, this option can increase the executable size by up to a factor of 10.

You have to consult your compiler manuals or the vendor's technical support for a more detailed answer.


Только из нее непонятно, где же брать готовую библиотеку, к которой можно линковаться, и какими опциями компилятора этого можно достичь.

S>Попробуй флаг -Os


Optimize for space rather than speed

Не помогает, размер результирующего exe в примере выше получается точно таким же. Вообще никакие опции оптимизации не помогают.
Re: gcc + console = 256512 byte
От: ArtDenis Россия  
Дата: 30.05.06 10:02
Оценка:
Думаю, что пока у GCC не появиться хорошего оптимизатора, а линкер не
научится убирать неиспользуемый код, решить эту проблему не удастся.
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: gcc + console = 256512 byte
От: Аноним  
Дата: 31.05.06 19:17
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Думаю, что пока у GCC не появиться хорошего оптимизатора, а линкер не

AD>научится убирать неиспользуемый код, решить эту проблему не удастся.
Спорное заявление. Когда гуёвое приложение делаю -не очень большое, но классов порядка 20 штук+ в каждом от 10 до 50 методов(обёртки для HWND и прочего) + <vector>- то размер экзешника даже меньше размера экзешника от VC7 (release конечно-же).
Re[3]: gcc + console = 256512 byte
От: Lab74  
Дата: 31.05.06 22:24
Оценка:
Может тогда действительно научиться линковать внешние библиотеки? Как кандидаты мне видятся msvcp50.dll, msvcp60.dll, msvcp71.dll; mfc40.dll, mfc40u.dll, mfc42.dll, mfc42u.dll. Или может есть какие не от MS?
Научил бы кто, как правильно это делать...
Re: gcc + console = 256512 byte
От: ArtDenis Россия  
Дата: 02.06.06 06:07
Оценка:
Аноним пишет:
> Не подскажите, как заставить gcc делать не такое здоровое консольное приложение. Если компилю WindowsGUI, то размер нормальный. А вот консольные приложения- ужас! Поскажите лечение данной проблемы!

Должно немного помочь (натравливать на скомпилённый exe-шник):
strip --strip-all test.exe
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: gcc + console = 256512 byte
От: Аноним  
Дата: 02.06.06 18:32
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Должно немного помочь (натравливать на скомпилённый exe-шник):

AD>
AD>strip --strip-all test.exe
AD>


Так это как раз после стрипанья у него размер 250 кб получается. Без этого около 480 (с дебаг-инфо и т.п.). Может дело в реализации STL? Реально ли STL от VisualC прикрутить?
Re[4]: gcc + console = 256512 byte
От: gear nuke  
Дата: 04.06.06 04:51
Оценка:
Здравствуйте, Lab74, Вы писали:

L>Может тогда действительно научиться линковать внешние библиотеки? Как кандидаты мне видятся msvcp50.dll, msvcp60.dll, msvcp71.dll; mfc40.dll, mfc40u.dll, mfc42.dll, mfc42u.dll. Или может есть какие не от MS?

L>Научил бы кто, как правильно это делать...

ИМХО правильно — использовать MSVC. Все эти либы для него родные, стало быть и проблем нет. C++ HelloWorld (с динамичеси прилинкованными либами) компилируется в 7K.

MinGW может быть оправдан в случае использования каких-то заточенных под GCC библиотек, других преимуществ у него нет. Компиляторы MSVC 2003 и 2005 доступны бесплатно. Качество генерируемого кода (на мой взгляд) обычно лучше. Если же использовать API виндовс — у MinGW могут возникнуть проблемы с заголовочными файлами.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: gcc + console = 256512 byte
От: Lab74  
Дата: 04.06.06 07:02
Оценка:
GN>ИМХО правильно — использовать MSVC. Все эти либы для него родные, стало быть и проблем нет. C++ HelloWorld (с динамичеси прилинкованными либами) компилируется в 7K.

Т.е. приведенный выше С++ пример Hello World (с iostream) компилируется в 7 kb?
И к какой dll он линкуется?
--> Просьба привести опции компиляции (лучше всего — командную строку целиком).
Re[6]: gcc + console = 256512 byte
От: gear nuke  
Дата: 04.06.06 17:38
Оценка:
Здравствуйте, Lab74, Вы писали:

L>Т.е. приведенный выше С++ пример Hello World (с iostream) компилируется в 7 kb?


Да, вот этот
Автор: Lab74
Дата: 29.05.06
.

L>И к какой dll он линкуется?


Я использовал компилятор от 2005й студии — msvcr80.dll (CRT) и msvcp80.dll (C++ lib). В раних версиях цыфры в именах dll будут другие.

-->> Просьба привести опции компиляции (лучше всего — командную строку целиком).


cl /MD /EHsc /Ox filename.cpp

/MD говорит, что нужно линковать с dll.

В IDE это меняется в свойствах проекта: C++ -> Code Generation -> Runtime Library
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: gcc + console = 256512 byte
От: gear nuke  
Дата: 04.06.06 17:57
Оценка:
Здравствуйте, Lab74, Вы писали:

L>Т.е. приведенный выше С++ пример Hello World (с iostream) компилируется в 7 kb?


Да, вот этот
Автор: Lab74
Дата: 29.05.06
.

L>И к какой dll он линкуется?


Я использовал компилятор от 2005й студии — msvcr80.dll (CRT) и msvcp80.dll (C++ lib). В раних версиях цыфры в именах dll будут другие.

-->> Просьба привести опции компиляции (лучше всего — командную строку целиком).


cl /MD /EHsc /Ox filename.cpp

/MD говорит, что нужно линковать с dll.

В IDE это меняется в свойствах проекта: C++ -> Code Generation -> Runtime Library
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: gcc + console = 256512 byte
От: Lab74  
Дата: 06.06.06 18:55
Оценка:
Здравствуйте, gear nuke,

большое спасибо!

А не знаешь ли ты случайно, как можно того же добиться с GCC / MinGW ?

Вот здесь что-то говорится об опциях -shared-libgcc и -static-libgcc :
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Link-Options.html
Re[3]: gcc + console = 256512 byte
От: mr_jek  
Дата: 07.06.06 07:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, ArtDenis, Вы писали:



А>Так это как раз после стрипанья у него размер 250 кб получается. Без этого около 480 (с дебаг-инфо и т.п.). Может дело в реализации STL? Реально ли STL от VisualC прикрутить?


а смысл, размер скорее всего еще больше получится, т.к. эта STL уж точно не будет использовать нестандартные расширения gcc
Re[2]: gcc + console = 256512 byte
От: mr_jek  
Дата: 07.06.06 07:22
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Думаю, что пока у GCC не появиться хорошего оптимизатора, а линкер не

AD>научится убирать неиспользуемый код, решить эту проблему не удастся.

Так вроде там давно инкрементный линкер, а компилятор умеет оптимизировать код
как по скорости, так и по размеру.
Re[7]: gcc + console = 256512 byte
От: mr_jek  
Дата: 07.06.06 07:23
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Lab74, Вы писали:



GN>Я использовал компилятор от 2005й студии — msvcr80.dll (CRT) и msvcp80.dll (C++ lib). В раних версиях цыфры в именах dll будут другие.


а каокй размер msvcp80.dll (C++ lib)?
Re[8]: gcc + console = 256512 byte
От: Lab74  
Дата: 07.06.06 07:56
Оценка: 1 (1)
_>а какой размер msvcp80.dll (C++ lib)?

у меня msvcp80.dll (v8.00.50727.42) : 548.864 b
она ссылается на:

msvcr80.dll (у меня v8.00.50727.42: 626.688 b)
а эта в свою очередь требует:

msvcrt.dll (у меня v7.0.2600.2180 : 343.040 b)
Re[3]: gcc + console = 256512 byte
От: Lab74  
Дата: 07.06.06 08:14
Оценка:
Здравствуйте, Аноним, Вы писали:
А> Может дело в реализации STL? Реально ли STL от VisualC прикрутить?

Здравствуйте, mr_jek, Вы писали:
_>а смысл, размер скорее всего еще больше получится, т.к. эта STL уж точно не будет использовать нестандартные расширения gcc

что понимается (вы понимаете) под STL? в каком виде оно существует (исходники, DLL etc.)
(Только прошу, не надо отвечать ссылками, ответьте лучше здесь своими словами)

Входит ли iostream (из обсуждаемого примера) в STL? Если нет, то зачем здесь упоминается STL?

Какие нестандартные расширения GCC имеются ввиду? (Надеюсь, туда не относится iostream?)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.