Программа GCC C ++ «Hello World» -> .exe имеет большой размер 500 КБ при компиляции в Windows. Как я могу уменьшить его размер? - PullRequest
29 голосов
/ 25 июня 2009

Я только недавно начал изучать C ++ - я использую версию MingW nuwen в Windows, используя NetBeans в качестве IDE (у меня также есть MSDN AA версия MSVC 2008, хотя я ее не очень использую) часто).

При компиляции этой простой программы:

#include <iostream>
using namespace std;

int dog, cat, bird, fish;

void f(int pet) {
  cout << "pet id number: " << pet << endl;
}

int main() {
  int i, j, k;
  cout << "f(): " << (long)&f << endl;
  cout << "dog: " << (long)&dog << endl;
  cout << "cat: " << (long)&cat << endl;
  cout << "bird: " << (long)&bird << endl;
  cout << "fish: " << (long)&fish << endl;
  cout << "i: " << (long)&i << endl;
  cout << "j: " << (long)&j << endl;
  cout << "k: " << (long)&k << endl;
} ///:~

мой исполняемый файл был размером около 1 МБ. Когда я изменил конфигурацию проекта с Debug на Release , использовал флаги -O1 -Os (убирая символы отладки по пути), размер двоичного файла был уменьшен с 1 МБ до 544 КБ.

Я не "фанат размера", но мне просто интересно - есть ли способ, которым я мог бы уменьшить размер .exe еще больше? Я просто думаю, что 544KB слишком много для такого простого приложения).

Ответы [ 13 ]

2 голосов
/ 25 июня 2009

Хорошо, когда вы используете стандартную библиотеку C ++, exe может стать действительно очень быстрой. Если после удаления символа отладки вы все еще хотите уменьшить размер программного обеспечения, вы можете использовать упаковщик, например UPX . Но, будьте осторожны, некоторые антивирусы задыхаются от exe-файла, упакованного с UPX, так как некоторые вирусы использовали его давным-давно.

1 голос
/ 12 февраля 2010

Как получается, что другие компиляторы, такие как msvc8 или даже компилятор порядка, например borland c ++ 5.5.1, способны создавать очень маленькие исполняемые файлы, а mingw gcc не может?

Я сделал быструю компиляцию «Привет, мир» для каждого из следующих наборы инструментов и соблюдали размер скомпилированного исполняемого файла. Обратите внимание, что в во всех этих случаях библиотека времени выполнения статически связана и все отладки символы были удалены:

compiler toolchain            exe size                   exe size
                              (w/iostream header)        (w/cstdio printf)
-------------------------------------------------------------------------
Borland C++ 5.5.1             110kbyte                    52kbyte
MSVC 2008 express             102kbyte                    55kbyte
MinGW- GCC 3.4.5              277kbyte                    <10kbyte
MinGW- GCC 4.4.1              468kbyte                    <10kbyte

Что интересно, более поздняя версия gcc 4.4.1 производит даже больший исполняемый файл, чем gcc3.4.5, возможно, из-за другой версии libstdc ++.

Так неужели нет способа удалить мертвый код на этапе компоновки для mingw?

0 голосов
/ 25 июня 2009

Большая часть размера связана с использованием довольно обширных библиотек времени выполнения. Так что в реальной жизни вы на самом деле связываете очень большой кусок «мертвого кода», если у вас есть такое простое приложение.

Насколько я знаю, нет флагов компоновщика, чтобы пропускать неиспользуемые части связанной библиотеки.

Есть два способа подделки меньшего приложения:

  1. Использовать динамическое связывание. Тогда ваше приложение ссылается на динамически загружаемую библиотеку. Вам все еще нужен полный размер (на самом деле больше), но у вас гораздо меньший исполняемый файл.
  2. Использование исполняемой системы сжатия .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...