Pregunta

Recientemente seguí una discusión en la lista de correo de Qt4-interest sobre si es legal o no crear una aplicación comercial / propietaria y vincular estáticamente Qt4. Si bien hay algunas formas no probadas de hacerlo (al proporcionar archivos de objetos y un Makefile, etc. al cliente), no suena como una buena idea después de todo.

Uno de mis proyectos es usar las bibliotecas Qt4 con licencia LGPL y las envío como DLL / Dylibs / so independientes a mi cliente, utilizando un instalador sencillo en todas las plataformas. Si bien esto funciona bastante bien hasta ahora, me gustaría optimizar a) el tamaño del instalador reduciendo el tamaño de la biblioteca Qt simplemente incluyendo lo que necesito, b) aumentar la velocidad de inicio / carga de mi aplicación.

Estoy familiarizado con la compilación de Qt, pero Qt tiene muchas banderas e interruptores.

Ahora mismo estoy construyendo con las siguientes banderas:

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

No estoy completamente seguro de qué efecto / impacto tienen las siguientes banderas:

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

¿Hay algo más que pueda hacer, por ejemplo, al proporcionar interruptores de optimización para el compilador, o " pelar " Las funciones no utilizadas salen de la biblioteca Qt construida para hacerla más pequeña (lo que sería fácil con las compilaciones estáticas). No tengo mucha experiencia con eso.

Oh, solo como una nota al margen, el tamaño de mi aplicación compilada es de unos 600 kb (sin separación) al vincular dinámicamente con Qt. Experimenté con él y descubrí que tenía un tamaño de alrededor de 4 MB cuando realizo un enlace estático; pero de esa manera ya no tendría que incluir 40 MB de bibliotecas Qt.

Entonces, para poner todo lo anterior en una pregunta / solicitud:

Si es más avanzado que yo en este tema, ¿cómo optimiza / implementa sus propias aplicaciones y se asegura de que comiencen rápido y que solo contengan lo que se necesita?

¿Fue útil?

Solución

Hay algunas cosas en las que puedo pensar:

  • use una combinación de compilador / enlazador que haga buenas optimizaciones de tamaño. MSVC es mucho mejor en esto que MinGW, por ejemplo. Todas las DLL de lanzamiento de Qt creadas con un total de MSVC de ~ 21 MB. Construidos con MinGW suman un total de ~ 41 MB. Por cierto, ¿ realmente necesita enviar todas las DLL?
  • use la marca -ltcg (Generación de código de tiempo de enlace) para optimizar los archivos de objetos.
  • use indicadores de preprocesador para excluir partes de la funcionalidad Qt. por ejemplo: QT_NO_STL = -no-stl.
  • prueba las banderas mmx / 3d now / sse2
  • eliminar algunos de los estilos (-no-style-)

Otros consejos

Cuando ha omitido todos los módulos y siente que no los necesita, puede continuar usando la herramienta qconfig (algo oculto en $ QTDIR / tools / tree) y eliminar clases individuales. Solo tenga cuidado con las dependencias: es posible que tenga que iterar varias veces para que Qt se construya (por ejemplo, QSpinBox depende de que QValidator esté presente).

Al crear Qt, especialmente varias veces, la marca -nomake es un gran ahorro de tiempo. Prueba -nomake ejemplos -nomake demos.

Otra optimización para la velocidad general se encuentra en el uso de optimizaciones del compilador al compilar Qt, pero hay que editar algunos archivos. Cuando obtienes Qt de Git, terminas con qtbase / dir. Primero ejecuta el script de configuración, que crea qmake

Nota: puede modificar Makefile.win32 o Makefile.unix y agregar líneas como:

QMAKE_CXXFLAGS_RELEASE = -CompilerDependentOptimizerSwitches 

si desea que qmake esté optimizado, pero no creo que sea realmente necesario, considerando que el tiempo de ejecución de qmake podría ser 0.0000001% del tiempo total de compilación para una aplicación de tamaño medio.

Pero la optimización real se produce al editar las mkspecs que se utilizan para compilar Qt.

Por ejemplo, en Windows con VS2012, es probable que modifique qtbase / mkspecs / win32-msvc2012 / qmake.conf .

Ex. : en Qt5.1 predeterminado, el msvc2012 mkspec lee:

QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CXXFLAGS_RELEASE  = $QMAKE_CFLAGS_RELEASE

Como desea optimizar el tamaño, puede reemplazarlo con:

QMAKE_CFLAGS_RELEASE    = -O1 -MD

(De acuerdo con http://msdn.microsoft.com/en-us /library/8f8h5cxt.aspx )

A veces incluye más mkspecs de alto nivel que se encuentran en qtbase / mkspecs / common / dir.

Compilé Qt5.1 con éxito en Debian / g ++ 4.8.1 con -O3 -march = native (el valor predeterminado es -O2 ) si sirve a alguien .

Después de hacer esto, simplemente ejecute make en la raíz Qt git, y vaya a tomar una cerveza con su equipo porque incluso en una buena computadora tomará años (aproximadamente 2 h en un i7, sin crear demostraciones / ejemplos, pero con webkit).

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

Optimizará Qt5.8 en Linux

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top