У меня было приложение 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, по крайней мере?)
Вы зависите от набора динамических библиотек. Те, которые в свою очередь зависят от других динамических библиотек, которые, в свою очередь, могут зависеть от других библиотек и т. Д. Если вы связываете статически, вам нужно соединить все библиотеки в дереве зависимостей. И да, это может сделать ваш исполняемый файл действительно большим, но это компромисс статической связи. И ваши требования к памяти на самом деле не будут реально изменены, все эти динамические библиотеки все равно должны быть загружены, связывание статически может фактически сохранить некоторую память, так как это только один файл, который должен быть загружен ОС. –
Возможно, вам не нужно использовать регулярное выражение, но функции библиотеки qt, которые вы используете, требуют регулярного выражения, поэтому они должны быть связаны. Если вы хотите использовать статическую связь, поиск всех косвенных зависимостей теперь является вашей ответственностью. Даже при динамической компоновке вы по-прежнему занимаетесь всем этим кодом, за исключением того, что динамический компоновщик делает все, что сработает для вас. –
Кроме того, это размер, который вы показываете для сборки отладки или выпуска? Вы пытались удалить отладку и другие метаданные из исполняемого файла? Пропустить флаги компилятора для оптимизации размера, а не скорости? –