2016-10-21 3 views
-2

У меня было приложение 300 KB, связанное динамически, из-за большого количества проблем я решил попробовать статическую сборку ссылок.Статически связанное приложение - уменьшение размера

Я настроил Qt со следующим:

configure -c++11 -mp -static -debug-and-release -platform win32-msvc2012 -opengl desktop -opensource -confirm-license -make libs -nomake tools -nomake tests -nomake examples -no-openssl -skip webkit 

На динамически подключаемой сборки я только должен был связать с зависимостями:

qtmain.lib 
Qt5Gui.lib 
Qt5Core.lib 
Qt5Widgets.lib 
Qt5Network.lib 
Qt5WinExtras.lib 
qwindows.lib 

Теперь я должен использовать 15 библиотек!

qtmain.lib 
qtpcre.lib 
Qt5Gui.lib 
Qt5Core.lib 
Qt5Widgets.lib 
Qt5Network.lib 
Qt5WinExtras.lib 
opengl32.lib 
imm32.lib 
Ws2_32.lib 
Qt5PlatformSupport.lib 
qtfreetype.lib 
winmm.lib 
qtharfbuzzng.lib 
qwindows.lib 

Я имею в виду, почему я должен связать с qtpcre или qtfreetype, если я не использую регулярные выражения ни свободного типа в моем решении? Мне действительно нужны все эти?

Я попытался включить полную оптимизацию.

В результатах мой размер приложения 10,731KB и это действительно расстраивает и удручает. Есть ли возможность уменьшить его? Возможно, внешние приложения?

(Да, я знаю, что это статическая сборка, и это не будет 7MB или меньше файла, но, возможно, я мог бы получить ниже 10MB, по крайней мере?)

+1

Вы зависите от набора динамических библиотек. Те, которые в свою очередь зависят от других динамических библиотек, которые, в свою очередь, могут зависеть от других библиотек и т. Д. Если вы связываете статически, вам нужно соединить все библиотеки в дереве зависимостей. И да, это может сделать ваш исполняемый файл действительно большим, но это компромисс статической связи. И ваши требования к памяти на самом деле не будут реально изменены, все эти динамические библиотеки все равно должны быть загружены, связывание статически может фактически сохранить некоторую память, так как это только один файл, который должен быть загружен ОС. –

+0

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

+0

Кроме того, это размер, который вы показываете для сборки отладки или выпуска? Вы пытались удалить отладку и другие метаданные из исполняемого файла? Пропустить флаги компилятора для оптимизации размера, а не скорости? –

ответ

1

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

Использование:

upx --best path/to/executable 

Рассматривают также добавляет -q вариант, который не будет выводить результаты). Таким образом, вы можете даже добавить этот инструмент в свой процесс сборки, чтобы избежать дополнительного ручного шага.

+0

Красивый инструмент. Благодаря! :) –

1

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

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

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

Я не помню флаги компилятора по умолчанию, но по умолчанию он, скорее всего, не оптимизирован для размера, поэтому для MSVC вы можете получить меньшие двоичные файлы, используя /O1 для минимального размера. Обратите внимание, что это может привести к небольшому ухудшению производительности.

Кроме того, несмотря на то, что количество библиотек выше, большинство из них довольно малы и на самом деле не будут добавлять столько к двоичному размеру.

Наконец-то вы действительно не хотите строить двоичные файлы для отладки для Qt - они огромны, и требуется много времени. Отладка с использованием версии динамической ссылки, только создайте статические двоичные файлы для выпуска.

Смежные вопросы