Можно ли создавать небольшие исполняемые файлы с помощью MINGW g ++? - PullRequest
2 голосов
/ 12 апреля 2011

Я понимаю, что MINGW-g ++ компилирует большие исполняемые файлы, потому что он статически связывает многие вещи. С другой стороны, MSVC ++ динамически связывается с библиотеками DLL из пакета VCRedist, и именно поэтому он создает намного меньшие исполняемые файлы.

Однако возможно ли скомпилировать с g ++ аналогичным образом в Windows? Не обязательно MINGW-g ++, но то, что я могу использовать с Qt Creator (я не добавил Qt в качестве тега, потому что это не имеет отношения к вопросу).

Ответы [ 3 ]

6 голосов
/ 12 апреля 2011

MinGW прекрасно способен динамически подключаться к среде исполнения msvcrt. Единственный беспорядок, от которого вы не избавитесь, это код запуска GCC / MinGW, который не очень велик.

Небольшая тестовая программа на C ++ (простая программа iostream hello world, примечание: я получил те же результаты для простой версии C printf).

#include <iostream>

using namespace std;

int main()
{
cout << "Hello World!" << endl;
return 0;
}

Commandlines:

g++ main.cpp -MD -Os -s -o test.exe
cl /MD /Os main.cpp /link /out:test2.exe

Размеры исполняемых файлов:

GCC: 13 КБ

MSVC: 6 КБ

Хотя это в два раза больше, весь необходимый код запуска учитывает большую разницу; для более крупных программ разница незначительна.

3 голосов
/ 26 октября 2011

Чтобы провести справедливое сравнение между VC ++ и MinGW с использованием статического связывания, я бы предложил удалить переключатель компилятора / MD в синтаксисе командной строки выше. Это заставит компилятор Visual C ++ статически связываться со статическими библиотеками, но компилятор Visual C ++ будет генерировать намного меньший исполняемый файл, чем статически компилируемый с MinGW.

Поскольку компоновщик, используемый компилятором Visual C ++, имеет функцию, называемую связью на уровне функций, при этом компоновщик связывает только необходимые библиотеки на основе функций, используемых в вашем коде. Любые функции, на которые нет ссылок или которые не используются, не будут связаны с конечным сгенерированным исполняемым файлом, в результате чего получится намного меньший статически связанный двоичный файл.

Возвращаясь к приведенному выше примеру с использованием компилятора Visual C ++ и на этот раз, используя статическое связывание, синтаксис командной строки будет выглядеть следующим образом:

cl / Os main.cpp / link /out:test2.exe

Здесь вы можете заметить, что я удалил ключ / MD, чтобы компилятор использовал статическое связывание вместо динамического.

Теперь, чтобы сделать статически связанный исполняемый файл намного меньшего размера, я предлагаю синтаксис командной строки:

cl / Ox main.cpp / link / FILEALIGN: 512 / OPT: REF / OPT: ICF / INCREMENTAL: NO /out:test2.exe

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

Я действительно получил эту идею из обсуждения на этом сайте в http://www.catch22.net/tuts/minexe

Большинство компиляторов Pascal, включая Delphi, также имеют такую ​​же функцию компоновки, и она известна как интеллектуальная компоновка, но получающиеся статически связанные исполняемые файлы намного меньше, чем те, которые создаются компилятором Visual C ++.

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

Я бы посоветовал сбросить MinGW и использовать вместо этого компилятор Visual C ++. Кажется, что даже разработчик MinGW не заботится о сокращении раздувания кода с помощью статических ссылок.

1 голос
/ 12 апреля 2011

Вы можете использовать cygwin (www.cygwin.com).Они используют DLL времени выполнения, очень похожую на MSVCRT.Тогда ваша программа, конечно, зависит от времени выполнения Cygwin (тавтология, извините).

...