Como configurar o Qt Creator para compilar os executáveis do Windows?

3

A versão do Qt Creator que é enviada nos repositórios. pode compilar executáveis Linux fora da caixa. No entanto, parece que é necessária alguma configuração para compilar os aplicativos do Windows.

Eu tenho o conjunto de ferramentas do Mingw32 instalado e tenho acesso a uma compilação do Windows das bibliotecas do Qt.

Quais etapas eu preciso fazer para que isso funcione?

    
por Nathan Osman 30.04.2011 / 00:55

3 respostas

0

aqui é um guia para isso Instalando as bibliotecas do Qt no Wine

Now download the Qt SDK and install it into the wine environment. At the time of this writing, we only tested version 4.7.4, but you can grab the latest version from the nokia website. For the sake of compatibility, make sure you download the same version as the one which comes with your Ubuntu version: check it here.

cd /tmp
wget http://get.qt.nokia.com/qt/source/qt-win-opensource-4.7.4-mingw.exe
wine qt-win-opensource-4.7.4-mingw.exe

The last command will launch the installer as if it was on a Windows environment. Do NOT run it as sudo! During the install you will be prompted that MinGW is missing: this is perfectly normal and can be ignored.

Após a instalação bem-sucedida, precisamos definir a variável de ambiente PATH no Wine, pois, por algum motivo, ela não é configurada automaticamente pelo instalador do Qt. Basta executar:

wine regedit

e navegue até "HKEY_CURRENT_USER / Environment". Clique com o botão direito e adicione um novo valor de string com o nome "Path". Clique duas vezes nele para editar e definir seu valor para "c: \ windows; c: \ windows \ system; c: \ qt \ 4.7.4 \ bin". Consulte o Guia do Usuário do Wine para obter mais detalhes sobre como definir variáveis ambientais.

Definindo o ambiente qmake de compilação cruzada

Agora, para a parte complicada. Os programas do Qt geralmente são compilados com o qmake, que cuida da configuração das opções corretas do compilador. Para este propósito, alguns arquivos de configuração específicos são necessários para a plataforma de destino. Precisamos criar esse arquivo de configuração, adaptado para compilação cruzada. Como modelo, usaremos o arquivo de configuração do win32, então vamos fazer uma cópia do ambiente relacionado primeiro:

cp -Rfp /usr/share/qt4/mkspecs/win32-g++ /usr/share/qt4/mkspecs/win32-x-g++

Nós temos que editar /usr/share/qt4/mkspecs/win32-x-g++/qmake.conf e substituir os compiladores padrão gcc e g ++ pelos cross-compilers fornecidos pelo pacote MinGW, junto com outras opções. A nossa aparência é assim:

#
# qmake configuration for win32-g++
#
# Written for MinGW
#

MAKEFILE_GENERATOR  = MINGW
TEMPLATE        = app
CONFIG          += qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header
QT          += core gui
DEFINES         += UNICODE QT_LARGEFILE_SUPPORT
QMAKE_COMPILER_DEFINES  += __GNUC__ WIN32

QMAKE_EXT_OBJ           = .o
QMAKE_EXT_RES           = _res.o

QMAKE_CC        = i586-mingw32msvc-gcc
QMAKE_LEX       = flex
QMAKE_LEXFLAGS      =
QMAKE_YACC      = byacc
QMAKE_YACCFLAGS     = -d
QMAKE_CFLAGS        =
QMAKE_CFLAGS_DEPS   = -M
QMAKE_CFLAGS_WARN_ON    = -Wall
QMAKE_CFLAGS_WARN_OFF   = -w
QMAKE_CFLAGS_RELEASE    = -O2
QMAKE_CFLAGS_DEBUG  = -g
QMAKE_CFLAGS_YACC   = -Wno-unused -Wno-parentheses

QMAKE_CXX       = i586-mingw32msvc-g++
QMAKE_CXXFLAGS      = $$QMAKE_CFLAGS
QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS
QMAKE_CXXFLAGS_WARN_ON  = $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
QMAKE_CXXFLAGS_RELEASE  = $$QMAKE_CFLAGS_RELEASE
QMAKE_CXXFLAGS_DEBUG    = $$QMAKE_CFLAGS_DEBUG
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
QMAKE_CXXFLAGS_THREAD   = $$QMAKE_CFLAGS_THREAD
QMAKE_CXXFLAGS_RTTI_ON  = -frtti
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions

QMAKE_INCDIR        = /usr/i586-mingw32msvc/include/
QMAKE_INCDIR_QT     = /home/matteo/.wine/drive_c/Qt/4.7.4/include
QMAKE_LIBDIR_QT     = /home/matteo/.wine/drive_c/Qt/4.7.4/lib

QMAKE_RUN_CC        = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CC_IMP    = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
QMAKE_RUN_CXX       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CXX_IMP   = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

QMAKE_LINK      = i586-mingw32msvc-g++
QMAKE_LINK_C        = i586-mingw32msvc-gcc
QMAKE_LFLAGS        = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
QMAKE_LFLAGS_EXCEPTIONS_OFF =
QMAKE_LFLAGS_RELEASE    = -Wl,-s
QMAKE_LFLAGS_DEBUG  =
QMAKE_LFLAGS_CONSOLE    = -Wl,-subsystem,console
QMAKE_LFLAGS_WINDOWS    = -Wl,-subsystem,windows
QMAKE_LFLAGS_DLL        = -shared
QMAKE_LINK_OBJECT_MAX   = 10
QMAKE_LINK_OBJECT_SCRIPT= object_script


QMAKE_LIBS      =
QMAKE_LIBS_CORE         = -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
QMAKE_LIBS_GUI          = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lws2_32 -lole32 -luuid -luser32 -ladvapi32
QMAKE_LIBS_NETWORK      = -lws2_32
QMAKE_LIBS_OPENGL       = -lglu32 -lopengl32 -lgdi32 -luser32
QMAKE_LIBS_COMPAT       = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
QMAKE_LIBS_QT_ENTRY     = -lmingw32 -lqtmain

#!isEmpty(QMAKE_SH) {
    MINGW_IN_SHELL      = 1
    QMAKE_DIR_SEP       = /
    QMAKE_QMAKE     ~= s,\\,/,
    QMAKE_COPY      = cp
    QMAKE_COPY_DIR      = xcopy /s /q /y /i
    QMAKE_MOVE      = mv
    QMAKE_DEL_FILE      = rm
    QMAKE_MKDIR     = mkdir
    QMAKE_DEL_DIR       = rmdir
    QMAKE_CHK_DIR_EXISTS = test -d
#} else {
#   QMAKE_COPY      = copy /y
#   QMAKE_COPY_DIR      = xcopy /s /q /y /i
#   QMAKE_MOVE      = move
#   QMAKE_DEL_FILE      = del
#   QMAKE_MKDIR     = mkdir
#   QMAKE_DEL_DIR       = rmdir
#   QMAKE_CHK_DIR_EXISTS    = if not exist
#}

QMAKE_MOC       = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc-qt4
QMAKE_UIC       = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic-qt4
QMAKE_IDC       = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc-qt4

QMAKE_IDL       = midl
QMAKE_LIB       = ar -ru
QMAKE_RC        = i586-mingw32msvc-windres
QMAKE_ZIP       = zip -r -9

QMAKE_STRIP     = i586-mingw32msvc-strip
QMAKE_STRIPFLAGS_LIB    += --strip-unneeded
load(qt_config)

Dica: se você encontrar algum problema ao configurar o arquivo de configuração, dê uma olhada no script que acompanha este tutorial, que automatiza cada etapa.

Bônus: configure um ambiente de arquitetura cruzada

Muitas máquinas novas são construídas com uma arquitetura de 64 bits. Se você estiver desenvolvendo em um desses, é provável que também queira produzir binários de 32 bits que possam ser executados em computadores mais antigos. Isso é facilmente alcançado, porque o pacote do Ubuntu fornece ambas as versões das bibliotecas. Há apenas uma linha a ser adicionada ao arquivo de configuração, faça isso executando:

echo "QMAKE_LIBDIR_QT         = /usr/lib32/" >>/usr/share/qt4/mkspecs/linux-g++-32/qmake.conf

Quanto ao ambiente Windows, a Nokia oferece apenas versões de 32 bits das bibliotecas Qt, que já devem ser compatíveis com as duas arquiteturas. A configuração que apresentamos já produzirá este tipo de executáveis. Se você deseja otimizar os binários para ambientes de 64 bits, há algumas opções:

Acquire a payed license for Qt from Nokia. Their support desk will then provide 64-bit binaries upon request.
Download the source code from the Nokia website, and compile Qt yourself for 64-bit environments.
Download and install unofficial (untrusted!) binaries you might be able to find in the Internet.
    
por Tachyons 28.03.2012 / 16:42
1

Eu encontrei uma solução muito mais fácil: basta instalar o Qt Creator no Wine.

Eu tive que usar winetricks para instalar os arquivos de tempo de execução do VC ++ 2008 primeiro, mas depois disso, funcionou perfeitamente.

    
por Nathan Osman 30.04.2011 / 23:34
0

Disclaimer: Eu não sou um ávido usuário do Qt Creator, então eu posso estar errado.

Se o Qt Creator suportar compiladores customizados, tente configurar o compilador mingw como um e configure os caminhos da biblioteca para os diretórios include do mingw (juntamente com os caminhos apropriados para os cabeçalhos do Windows).

Este método funcionou para mim no passado em outros IDEs (como codeblocks), então eu estou indo em um membro e acho que vai para o Qt Creator também.

Editar:

Depois de pesquisar no Qt Creator, não sei se isso é possível.

    
por RolandiXor 30.04.2011 / 01:10