Построение оптимизированных флагов Qt4 - “./configure” и их значения

StackOverflow https://stackoverflow.com/questions/1807203

Вопрос

Недавно я следил за обсуждением в списке рассылки Qt4-interest о том, законно или нет создавать коммерческое / проприетарное приложение и статически привязывать к нему Qt4.Хотя есть несколько непроверенных способов сделать это (путем предоставления объектных файлов и Makefile и т.д.для клиента), в конце концов, это звучит не так уж и хорошо.

В одном из моих проектов используются библиотеки Qt4, лицензированные LGPL, и я отправляю их моему заказчику в виде отдельных DLL / Dylibs / so, используя простой установщик на всех платформах.Хотя пока это работает довольно хорошо, я хотел бы оптимизировать а) размер установщика, уменьшив размер библиотеки Qt, просто включив то, что мне нужно, б) увеличив скорость запуска / загрузки моего приложения.

Я сам знаком с компиляцией Qt, но в Qt много флагов и переключателей.

Прямо сейчас я строю со следующими флагами:

./configure \
  -fast \
  -opensource \
  -qt-sql-sqlite \
  -nomake demos examples \
  -silent \
  -no-qt3support \
  -no-gif \
  -plugin-sql-mysql \
  -release \
  -no-xmlpatterns \
  -no-multimedia

Я не совсем уверен, какой эффект оказывают следующие флаги:

  • -no-stl
  • -no-javascript-jit
  • -no-nis
  • -separate-debug-info
  • -no-openvg
  • -no-mitshm

Есть ли что-нибудь еще, что я могу сделать, например, предоставив оптимизационные переключатели для компилятора или "удалив" неиспользуемые функции из встроенной библиотеки Qt, чтобы уменьшить ее размер (что было бы легко при статических сборках).У меня не так уж много опыта в этом.

О, просто в качестве дополнительного примечания, размер моего скомпилированного приложения составляет около 600 кб (без разделки) при динамической привязке к Qt.Я поэкспериментировал с ним и обнаружил, что при статической ссылке его размер составляет около 4 МБ;но таким образом мне больше не пришлось бы включать 40 МБ библиотек Qt.

Итак, чтобы поместить все вышесказанное в вопрос / запрос:

Если вы более продвинуты в этой теме, чем я, как вы оптимизируете / развертываете свои собственные приложения и убедитесь, что они быстро запускаются и содержат только то, что необходимо?

Это было полезно?

Решение

Есть несколько вещей, о которых я могу думать:

  • используйте комбинацию компилятор / компоновщик, которая выполняет хорошую оптимизацию размера.MSVC намного лучше в этом, чем, например, MinGW.Все библиотеки DLL версии Qt, созданные с помощью MSVC, имеют общий объем ~ 21 МБ.Созданные с помощью MinGW, они имеют общий объем ~ 41 МБ.Кстати, а ты действительно нужно отправить все библиотеки DLL?
  • используйте флаг -ltcg (генерация кода во время соединения) для оптимизации всех объектных файлов.
  • используйте флаги препроцессора, чтобы исключить части функциональности Qt.например, g:QT_NO_STL = -нет-stl.
  • попробуйте флаги mmx / 3d now / sse2
  • удалите некоторые стили (-no-style-)

Другие советы

Когда вы пропустите все модули, которые, по вашему мнению, вам не нужны, вы можете продолжить использовать инструмент qconfig (вроде как скрытый в $ QTDIR /tools / tree) и удалить отдельные классы.Просто остерегайтесь зависимостей - возможно, вам придется выполнить итерацию несколько раз, чтобы заставить Qt выполнить сборку (например, QSpinBox зависит от наличия QValidator).

При сборке Qt, особенно многократной, флаг -nomake отлично экономит время.Попробуйте -nomake examples -демоверсии nomake.

Другая оптимизация для общей скорости заключается в использовании оптимизаций компилятора при компиляции Qt, но вам придется отредактировать некоторые файлы.Когда вы получаете Qt из Git, в итоге вы получаете qtbase / dir.Сначала вы запускаете скрипт configure, который создает qmake

Примечание: вы можете изменить Makefile.win32 или Makefile.unix и добавить строки типа :

QMAKE_CXXFLAGS_RELEASE = -CompilerDependentOptimizerSwitches 

если вы хотите, чтобы qmake был оптимизирован, но я не думаю, что это действительно необходимо, учитывая, что время выполнения qmake может составлять 0,0000001% от всего времени компиляции для приложения среднего размера.

Но тот реальный оптимизация происходит при редактировании mkspecs, которые используются для сборки Qt.

Например, в Windows с VS2012 вы, скорее всего, измените qtbase/mkspecs/win32-msvc2012/qmake.conf.

Бывший.:по умолчанию Qt5.1, msvc2012 mkspec читает :

QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CXXFLAGS_RELEASE  = $$QMAKE_CFLAGS_RELEASE

Поскольку вы хотите оптимизировать размер, вы могли бы заменить его на :

QMAKE_CFLAGS_RELEASE    = -O1 -MD

(В соответствии с http://msdn.microsoft.com/en-us/library/8f8h5cxt.aspx )

Иногда он включает в себя более высокоуровневые спецификации mkspec, найденные в qtbase/mkspecs/common/ реж.

Я успешно скомпилировал Qt5.1 на Debian / g ++ 4.8.1 с -O3 -march=native (значение по умолчанию равно -O2) если это кому-то служит.

После этого просто запустите make на Qt git root и идите пить пиво со своей командой, потому что даже на хорошем компьютере это займет целую вечность (ок.2 часа на i7, без создания демонстраций / примеров, но с webkit).

sed -i 's@QMAKE_CXXFLAGS_THREAD  += $$QMAKE_CFLAGS_THREAD@QMAKE_CXXFLAGS_THREAD  += $$QMAKE_CFLAGS_THREAD -march=native@g'  qtbase/mkspecs/common/linux.conf

Оптимизирует Qt5.8 на Linux

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top