Как размер скомпилированных двоичных файлов зависит от используемых библиотек? C / C ++ - PullRequest
2 голосов
/ 24 декабря 2011

На прошлой неделе я нашел в интернете простую игру под названием killallcops.exe . Я изучил двоичные файлы и удивился, почему программа такая большая. (Около 460к)

Поэтому я переписал игру, используя iostream

#include <iostream>
int main(){
    std::cout << "All cops are killed.\nCongratulations";
    std::cin.ignore();
    return 0;
}

скомпилировал его с g ++ и тоже получил 460 тыс.

Я действительно удивился, почему эта штука такая большая, и переписал ее с помощью stdio

#include <stdio.h>
int main(){
    printf("All cops are killed.\nCongratulations");
    while(getchar() != '\n'){}
    return 0;
}

скомпилировал его с помощью gcc и получил 13k.

Я знаю, что iostream имеет гораздо больше возможностей, чем stdio (например, typesafety), и поэтому сам по себе намного больше, но почему это приводит к увеличению двоичных файлов и есть решения для уменьшения размера при использовании iostream, например, только с использованием определенных деталей из этого?

edit: как указано ниже с использованием gcc 3.4.4 под cygwin

Ответы [ 3 ]

3 голосов
/ 24 декабря 2011

Я уточню свой комментарий в качестве ответа:

<iostream> имеет много внутренних зависимостей, даже для использования простого вызова cout. Он вводит много других кодов / заголовков, необходимых для работы (включая код шаблона и тому подобное). Скажем прямо, размер ввода <iostream>, вероятно, не очень важен в нетривиальном приложении.

Вы можете доверять компилятору / компоновщику, чтобы знать, что они делают, но если вы хотите уменьшить двоичный размер, попробуйте использовать параметры, такие как gcc -s, который убирает символы, или флаги, такие как -Os, который пытается оптимизировать двоичный файл для размера.

Я подозреваю, что многие ваши проблемы с размером двоичного кода на самом деле происходят из-за чего-то другого: статически связанных libstdc++.

Если вы используете MinGW в Windows, учтите, что до недавнего времени в их реализации инструментария GCC не было динамически связанной libstdc++; вместо этого все сборки C ++ статически связаны в libstdc++, что значительно увеличит размер ваших двоичных файлов.

Вот сравнение, размер двоичного файла, создаваемого g++ для вашего кода в Linux, с использованием GCC 4.6.1. На этих сборках не выполнялась оптимизация или удаление символов.

λ > ls -lh a.out          
-rwxr-xr-x 1 billylee billylee 6.1K Dec 24 10:37 a.out

А вот один, произведенный GCC

λ > ls -lh trial
-rwxr-xr-x 1 billylee billylee 4.9K Dec 24 10:41 trial

Версия g ++ немного больше, чем версия gcc, но не в 100 раз больше.

edit: Если вы используете MinGW - здесь есть недавняя тема: Как уменьшить размер исполняемого файла, создаваемого компилятором MinGW g ++?

MinGW gcc 4.5.0+ должен использовать динамическое связывание по умолчанию, проверьте свою версию, если вы используете MinGW.

2 голосов
/ 24 декабря 2011

Ответ: он не такой большой.Скомпилировано на C ++ 4.6 в Linux без параметров компиляции, это 9040 байт.После удаления это 6312 байт.

Какие опции компиляции вы использовали и какую версию g ++ вы используете?

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

На заметку о том, что #import является устаревшим g ++ толькорасширение языка, вы должны использовать #include

2 голосов
/ 24 декабря 2011

Я не воспроизводлю в Linux (размеры 9K и 8K).Я предполагаю, что для C ++ вы статически связываете стандартную библиотеку, а для C вы динамически связываете ее.

...