Eu tenho um projeto Qt e gostaria de gerar arquivos de compilação fora da árvore de origem.
Atualmente, tenho a seguinte estrutura de diretório:
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
Dependendo da configuração (depuração / liberação), gostaria de enviar os arquivos resultantes dentro do diretório de compilação nos diretórios de compilação / depuração ou compilação / liberação.
Como posso fazer isso usando um arquivo .pro?
Respostas:
A resposta curta é: você não .
Você deve executar
qmake
seguido pormake
em qualquer diretório de construção que deseja construir. Portanto, execute-o uma vez em umdebug
diretório, uma vez em umrelease
diretório.É assim que qualquer pessoa que está construindo seu projeto esperaria que ele funcionasse, e é assim que o próprio Qt é configurado para ser construído, é assim que o Qt Creator espera que seu
.pro
arquivo se comporte: ele simplesmente iniciaqmake
e entãomake
na pasta de construção para a configuração escolhida por seu destino.Se você deseja criar essas pastas e realizar as duas (ou mais) compilações nelas, você precisará de um makefile de nível superior, possivelmente criado a partir de um arquivo de projeto de nível superior via qmake.
Não é incomum ter mais de duas configurações de compilação, portanto, você desnecessariamente se compromete a apenas diferenciar entre uma compilação e uma versão; você pode ter compilações com diferentes níveis de otimização, etc. É melhor deixar a dicotomia depurar / liberar para descansar.
fonte
Para o meu projeto Qt, eu uso este esquema no arquivo * .pro:
É simples, mas legal! :)
fonte
DESTDIR
s condicionalmente, e, em seguida, usar esse valor em todos os seus outros caminhos:OBJECTS_DIR = $${DESTDIR}/.obj
. Felicidades!Debug
paradebug
eRelease
pararelease
.Para alterar o diretório para dll / exe de destino, use isso em seu arquivo pro:
Você também pode querer alterar os diretórios para outros destinos de construção, como arquivos de objeto e arquivos moc (verifique a referência de variável qmake para obter detalhes ou a referência de função qmake CONFIG () ).
fonte
OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui
CONFIG()
acaba resolvendo alguns problemas de usorelease:
edebug:
Tenho uma abordagem mais compacta:
fonte
A maneira correta de fazer isso é a seguinte (obrigado Equipe de Suporte QT):
Mais informações aqui: https://wiki.qt.io/Qt_project_org_faq#What_does_the_syntax_CONFIG.28debug.2Cdebug.7Crelease.29_mean_.3F_What_does_the_1st_argument_specify_and_similarly_what_is_the_2
fonte
Eu uso o mesmo método sugerido por chalup,
fonte
Pergunta antiga, mas ainda vale uma resposta atualizada. Hoje é comum fazer o que o Qt Creator faz quando construções de sombra são usadas (elas são ativadas por padrão ao abrir um novo projeto).
Para cada tipo e destino de construção diferente, o direito
qmake
é executado com os argumentos certos em um diretório de construção diferente. Então isso é simplesmente construído com o simplesmake
.Portanto, a estrutura de diretório imaginária pode ter esta aparência.
E o importante é que a
qmake
é executado no diretório de construção:Em seguida, ele gera makefiles no diretório de construção e, em seguida,
make
irá gerar arquivos nele também. Não há risco de misturar versões diferentes, desde que o qmake nunca seja executado no diretório de origem (se for, é melhor limpar bem!).E quando feito assim, o
.pro
arquivo da resposta aceita atualmente é ainda mais simples:fonte
$(OUT_PWD)
seja a solução?mylib
? Eu gostaria que houvesse uma maneira "graciosa" de fazer isso, não vejo outra maneira além de usar as técnicas das outras respostas: use o tipo de construção e configuração para preencher deLIBS
forma inteligente, anulando a vantagem da construção de sombra.include(../mylib/mylib.pri)
Também é útil ter um nome ligeiramente diferente para o executável de saída. Você não pode usar algo como:
Por que isso não funciona não está claro, mas não funciona. Mas:
Isso funciona, desde que a
CONFIG +=
linha o preceda.fonte
A nova versão do Qt Creator também possui uma opção de construção de "perfil" entre depuração e liberação. Veja como estou detectando isso:
fonte
1. Encontre Debug / Release em CONFIG
Obtenha o atual (debug | release).
(Pode ser múltiplo, portanto, mantenha apenas o último especificado na construção):
2. Defina DESTDIR
Use-o com o nome do subdiretório build
fonte
Este é o meu Makefile para diferentes diretórios de saída de depuração / liberação. Este Makefile foi testado com sucesso no Linux Ubuntu. Ele deve funcionar perfeitamente no Windows, desde que o Mingw-w64 esteja instalado corretamente.
fonte