Чтобы провести справедливое сравнение между 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 не заботится о сокращении раздувания кода с помощью статических ссылок.