Сборка оптимизированных флагов Qt4 - "./configure" и их значений - PullRequest
2 голосов
/ 27 ноября 2009

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

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

Я сам знаком с компиляцией 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.

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

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

Ответы [ 4 ]

2 голосов
/ 27 ноября 2009

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

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

2 голосов
/ 27 ноября 2009

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

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

0 голосов
/ 31 июля 2013

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

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

QMAKE_CXXFLAGS_RELEASE = -CompilerDependentOptimizerSwitches 

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

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

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

Ex. : по умолчанию 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)

Иногда он включает в себя больше высокоуровневых mkspecs, найденных в qtbase/mkspecs/common/ dir.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...