G ++ производит большие двоичные файлы, несмотря на небольшой проект - PullRequest
3 голосов
/ 30 ноября 2009

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

Проблема в том, что у меня есть проект, который состоит из 6 исходных файлов. Все они не более 200 строк кода. Он использует много контейнеров STL, stdlib.h и iostream. Теперь размер исполняемого файла составляет около 800 КБ .... Думаю, я не должен статически связывать библиотеки. Как это сделать с GCC? А в Eclipse CDT?

EDIT: Поскольку я отвечаю далеко от того, что я хочу, я думаю, что это имеет место для разъяснения. Я хочу знать, почему такая маленькая программа настолько велика по размеру и какова связь со статическими, общими библиотеками и их различием. Если рассказывать слишком долго, не стесняйтесь указывать документам. Спасибо

Ответы [ 7 ]

2 голосов
/ 30 ноября 2009

Следует помнить, что использование STL приводит к тому, что этот дополнительный код в исполняемом файле , даже если вы динамически подключаетесь к библиотеке C ++. Это связано с тем, что STL - это набор шаблонов , которые на самом деле не компилируются, пока вы не напишите и не скомпилируете свой код. Поскольку библиотека не может предвидеть, что вы можете хранить в контейнере, у библиотеки нет возможности уже содержать код для этого конкретного использования контейнера. То же самое касается алгоритмов и всего остального в STL.

Я не говорю, что это определенно причина того, что ваш исполняемый файл намного больше, чем вы ожидаете. Но это может быть фактором.

2 голосов
/ 30 ноября 2009

Если вы даете имена динамической библиотеки g ++ и не используете флаг -static, она должна динамически связываться.

Чтобы уменьшить размер, вы, конечно, можете strip двоичный файл и передать флаг оптимизации -Os (оптимизировать по размеру) в g++.

1 голос
/ 30 ноября 2009

Исполняемый файл должен содержать не только ваш код.

По крайней мере, он содержит некоторый код запуска, настройку среды и, при необходимости, загрузку любых внешних библиотек перед запуском программы.

Если вы статически связали библиотеку времени выполнения, вы также включите ее в свой исполняемый файл. В противном случае вы получите только небольшую заглушку, достаточно большую, чтобы перенаправить системные вызовы на внешнюю среду выполнения.

Может, в зависимости от настроек компилятора, включать также много отладочной информации и других несущественных данных. Если оптимизация включена, это также может привести к увеличению размера кода.

Реальный вопрос - , почему это имеет значение ? 800KB по-прежнему легко помещается на дискету! Большая часть это единовременная стоимость. это не значит, что если вы напишите вдвое больше кода, это займет 1600 КБ. Скорее всего, это займет 810 КБ или что-то в этом роде.

Не беспокойтесь о разовых затратах на запуск.

1 голос
/ 30 ноября 2009

Eclipse должен динамически связываться по умолчанию, если вы не установили статический флаг на компоновщике в вашем make-файле.

В ответ на ваше РЕДАКТИРОВАНИЕ:

- при статической ссылке исполняемый файл содержит полную копию каждой библиотеки, с которой вы связались.
-при динамическом связывании исполняемый файл содержит только ссылки и ссылки на связанные библиотеки, что значительно меньше кода.

0 голосов
/ 07 ноября 2010

использовать Visual C ++ 6.0 поддерживается с Windows 95 до Windows 7. и могут быть скомпилированы как платформы x86, но только для Windows. так что если вы пользователь Windows, просто придерживайтесь компиляторов Windows, отличных от GCC, что на самом деле достаточно. Большинство людей, которые говорят, что Visual C ++ - это так, потому что они являются антимикросферами. также не забывайте использовать «Visual C ++ 6.0», если вы используете более новый, возможно, вы не можете запускать свои файлы в Windows 95. Я проверил все эти вещи, поэтому я сказал. GCC производит самые большие двоичные файлы, но Visual C ++ нет, компилятор Intel может использовать для экономии более 30% пространства, но он требует процессор Intel, если производительность не будет ужасной. Еще одна вещь, которую вы должны помнить, это когда вы используете шаблоны, хотя вы видите маленькие линии когда вы компилируете, эти функции будут расширены, и в результате вы получите более крупные двоичные файлы. если вам нужны меньшие двоичные файлы, я предлагаю перейти к C, потому что C на самом деле широко используется, но не OO Infact C проще в использовании, чем C ++ это имеет смысл тогда C ++ пример

cout << "Hello World" << endl; printf ("% s", "Hello World"); </p>

второй говорит, что поле печати% s означает, что вы набираете строку, так что это легко. : P

0 голосов
/ 30 ноября 2009

Размер обычно приводит к тому, что статические библиотеки связываются с вашим приложением.

Вы можете уменьшить размер скомпилированного двоичного файла, компилируя его в версии RELEASE с оптимизацией до двоичного размера.

Другим источником размера исполняемого файла являются библиотеки. Вы сказали, что не используете внешние библиотеки, кроме STD, поэтому я полагаю, что вы включаете среду выполнения C в свой исполняемый файл, то есть статически связываете. так что проверьте динамическое связывание.

IMO, вам не стоит об этом беспокоиться, но если вы действительно параноик, проверьте это: Самый маленький x86 ELF Hello World

0 голосов
/ 30 ноября 2009

Используйте флаги -O3 и -s для получения наиболее оптимизированного двоичного файла. Также см. Эту ссылку для получения дополнительной информации.

Если вы строите для Windows, рассмотрите возможность использования компилятора Microsoft. На этой платформе всегда создается самый маленький двоичный файл.

...