Pergunta

Recentemente, seguido de uma discussão na lista de discussão Qt4 interesse sobre se é legal ou não construir uma aplicação comercial / proprietário e estaticamente link Qt4 para ele. Embora existam algumas formas não-comprovada de fazê-lo (fornecendo arquivos de objetos e um Makefile, etc. para o cliente), ela não soa como tal boa idéia afinal.

Um dos meus projetos é usando as bibliotecas Qt4-licenciado LGPL e eu enviá-los como DLLs / Dylibs separados / so é para o meu cliente, usando um simples instalador em todas as plataformas. Enquanto isso funciona muito bem até agora, eu gostaria de otimizar a) o tamanho do instalador, reduzindo o tamanho da biblioteca Qt por apenas incluindo o que eu preciso, b) aumentar a velocidade de inicialização / carregamento da minha aplicação.

Eu estou familiarizado com compilar Qt mim mesmo, mas Qt tem um monte de bandeiras e switches.

Agora eu estou construindo com as seguintes bandeiras:

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

Eu não sou inteiramente certo que efeito / impacto as seguintes bandeiras têm:

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

É mais há nada que eu possa fazer, por exemplo, através do fornecimento de otimização de interruptores para o compilador, ou "descascar" funções não utilizados para fora da biblioteca Qt construído para torná-lo menor (o que seria fácil com estático compilações). Eu não tenho muita experiência com isso.

Oh, assim como uma nota lateral, o meu tamanho aplicação compilada é de cerca de 600 kb (não despojado) quando liga contra Qt dinamicamente. Eu experimentei com ele e achei que fosse cerca de 4 MB de tamanho quando eu vincular estaticamente; mas desta forma eu não teria que incluem 40 MB de bibliotecas Qt mais.

Assim, para colocar tudo acima em uma pergunta / solicitação:

Se você está mais avançado do que me sobre este tema, como você otimizar / implantar as suas próprias aplicações e certifique-se que eles começam rápido e conter apenas o que é necessário?

Foi útil?

Solução

Há algumas coisas que eu posso pensar de:

  • usar uma combinação de compilador / vinculador que faz boas otimizações de tamanho. MSVC é muito melhor nisso do que MinGW por exemplo. Todas as DLLs libertação Qt construídos com MSVC total a ~ 21 MB. Construído com MinGW eles total em ~ 41 MB. By the way, você realmente necessidade de enviar todas as DLLs?
  • usar o -ltcg (geração de código link-time) flag para otimizar toda a arquivos objeto.
  • bandeiras uso de pré-processamento para excluir partes da funcionalidade Qt. por exemplo: QT_NO_STL = -no-STL.
  • experimentar a MMX / 3D agora / bandeiras SSE2
  • remover alguns dos estilos (-no-estilo -)

Outras dicas

Quando você ter pulado todos os módulos e de tal forma que você sente que você não precisa, então você pode continuar usando a ferramenta qconfig (tipo de escondido no $ QTDIR / ferramentas / árvore) e remover as classes individuais. Só cuidado com dependências -. Você pode ter que iterate algumas vezes para obter Qt para construção (por exemplo, QSpinBox depende QValidator estar presente)

Quando a construção de Qt, especialmente várias vezes, a bandeira -nomake é uma grande economia de tempo. Tente -nomake exemplos -nomake demos.

Outra otimização para mentiras gerais de velocidade na utilização de optimizações do compilador ao compilar Qt, mas você tem que editar alguns arquivos. Quando você começa Qt do Git, você acaba com um qtbase / dir. Primeiro você executar o script configure, que constrói qmake

Nota: você pode modificar Makefile.win32 ou Makefile.unix e adicionar linhas como:

QMAKE_CXXFLAGS_RELEASE = -CompilerDependentOptimizerSwitches 

Se você quiser qmake para ser otimizado, mas eu não acho que isso é realmente necessário, considerando que o tempo de execução de qmake pode ser 0.0000001% de todo o tempo de compilação para um aplicativo de médio porte.

Mas o real otimização vem ao editar as mkspecs que são usados ??para construir Qt.

Por exemplo, sob janelas com VS2012, você provavelmente iria modificar qtbase/mkspecs/win32-msvc2012/qmake.conf.

Ex. : Em default Qt5.1, o msvc2012 mkspec lê-se:

QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CXXFLAGS_RELEASE  = $$QMAKE_CFLAGS_RELEASE

Uma vez que você deseja otimizar para o tamanho, você poderia substituí-lo com:

QMAKE_CFLAGS_RELEASE    = -O1 -MD

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

Às vezes, inclui mais mkspecs de alto nível encontrados em dir qtbase/mkspecs/common/.

Eu compilado com sucesso Qt5.1 no Debian / g ++ 4.8.1 com -O3 -march=native (o padrão é -O2) se serve ninguém.

Depois de fazer isso, fazer apenas executado no git raiz Qt, e ir tomar uma cerveja com sua equipe, porque mesmo em um bom computador que levará as idades (aprox. 2h em um i7, sem construir Demos / exemplos, mas com webkit).

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

Será otimizar Qt5.8 no Linux

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top