如何设置 Qt Creator 来编译 Windows 可执行文件?

如何设置 Qt Creator 来编译 Windows 可执行文件?

存储库中附带的 Qt Creator 版本可以立即编译 Linux 可执行文件。但是,似乎需要进行一些配置才能使其编译 Windows 应用程序。

我已经安装了 Mingw32 工具链,并且可以访问 Qt 库的 Windows 版本。

我需要采取什么步骤才能使其发挥作用?

答案1

我发现了一个更简单的解决方案:只需在 Wine 下安装 Qt Creator。

我必须winetricks先安装 VC++ 2008 运行时文件,但之后它就能完美运行了。

答案2

这里是将 Qt 库安装到 Wine 中的指南

现在下载 Qt SDK 并将其安装到 wine 环境中。在撰写本文时,我们仅测试了 4.7.4 版本,但您可以从诺基亚网站获取最新版本。为了兼容性,请确保下载与您的 Ubuntu 版本相同的版本:在此处查看。

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

最后一个命令将启动安装程序,就像在 Windows 环境中一样。请勿以 sudo 身份运行它!在安装过程中,系统将提示您缺少 MinGW:这是完全正常的,可以忽略。

安装成功后,我们需要在 Wine 中设置环境变量 PATH,因为出于某种原因,Qt 安装程序不会自动设置它。只需运行:

wine regedit

并浏览至“HKEY_CURRENT_USER/Environment”。右键单击并添加名为“Path”的新字符串值。双击它进行编辑并将其值设置为“c:\windows;c:\windows\system;c:\Qt\4.7.4\bin”。有关如何设置环境变量的更多详细信息,请参阅 Wine 用户指南。

定义交叉编译 qmake 环境

现在到了棘手的部分。Qt 程序通常使用 qmake 进行编译,它负责设置正确的编译器选项。为此,目标平台需要一些特定的配置文件。我们需要创建这样一个配置文件,专门用于交叉编译。作为模板,我们将使用 win32 配置文件,因此让我们首先复制相关环境:

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

我们必须编辑 /usr/share/qt4/mkspecs/win32-x-g++/qmake.conf,将默认编译器 gcc 和 g++ 替换为 MinGW 包提供的交叉编译器以及其他选项。我们的如下所示:

#
# 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)

提示:如果您在设置配置文件时遇到任何问题,请查看本教程附带的脚本,该脚本可自动执行每个步骤。

奖励:建立跨架构环境

许多新机器都采用 64 位架构。如果您正在其中一种机器上进行开发,则很可能您还想生成可以在旧计算机上运行的 32 位二进制文​​件。这很容易实现,因为 Ubuntu 软件包提供了这两个版本的库。只需在配置文件中添加一行,运行以下命令即可:

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

至于 Windows 环境,诺基亚仅提供 32 位版本的 Qt 库,这些库应该已经与这两种架构兼容。我们介绍的设置已经可以生成这种可执行文件。如果您想针对 64 位环境优化二进制文件,有以下几种选择:

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.

答案3

免责声明:我并不是 Qt Creator 的狂热用户,所以我可能是错的。

如果 Qt Creator 支持自定义编译器,请尝试将 mingw 编译器设置为一个,并将库路径设置为 mingw 的包含目录(以及 Windows 标题的适当路径)。

这种方法以前在其他 IDE(比如 codeblocks)上对我有用,所以我冒险猜测它对 Qt Creator 也同样有效。

编辑:

在 Qt Creator 中搜索一番后,我不太确定这是否可行。

相关内容