我已经下载了Qt 4.8.2库,Qt Creator 2.5.2,并使用w32api 3.13版本和GCC / g ++版本4.7.0.1手动安装了MingW。我的操作系统是Windows 7 Ultimate x64。
我可以在Qt Creator中创建一个示例“Plain C ++ project”;使用g ++编译和运行该控制台应用程序没有任何问题。
但我不能运行一个Qt应用程序。我使用了Qt Creator,使用Creator的“Qt Gui Application”模板创建了一个虚拟Qt应用程序。该项目可以成功编译,没有任何错误或警告。但是当我尝试运行时(来自Qt Creator
和Windows Explorer
),二进制文件不断崩溃。调试和发布都构建崩溃。它甚至在显示主窗口之前就崩溃了。
MingW安装在C:\MingW
,C:\MingW\bin
位于PATH
。 Qt安装在C:\Qt\4.8.2
中,C:\Qt\4.8.2\bin
位于PATH
。
我用Dependency Walker分析了Qt Gui应用程序输出的生成exe,发现它找到了所有必需的DLL:
那么,是什么导致运行时崩溃?
修改
我也尝试过Qt的示例项目:2dpainting和addressbook - 它们在启动时都崩溃了。
答案 0 :(得分:4)
您应该使用您用来构建应用程序的MinGW编译器构建Qt。与MSVC相比,GCC对二进制兼容性问题的敏感度通常较低,但Qt是一个庞大而复杂的框架库。如果有任何事情会暴露这些问题,Qt可能会在短名单上。
构建Qt非常简单,但需要花费大量时间,而且我需要做两到三个补丁才能成功构建。
我最后一次使用MinGW制作Qt(4.7.3)时,我不得不制作以下补丁 - 我不确定它们是否仍适用于Qt 4.8:
MinGW的某些发行版如何将Microsoft扩展程序合并到float.h
时出现问题 - 我有时不得不添加该行:
#include_next <float.h>
到MinGW特定float.h
的末尾,以便正确处理通用GCC float.h
。我必须为nuwen 4.7.0 lib/gcc/i686-pc-mingw32/4.7.0/include/float.h
和TDM 4.6.1 32位发行版lib/gcc/mingw32/4.6.1/include/float.h
执行此操作(TDM的64位发行版不需要此补丁)。
修补程序qmake\Makefile.win32-g++
和qmake\Makefile.win32-g++-sh
删除GCC无法识别的-static-libstdc++
选项(现在错误而不是忽略)
修补程序mkspecs/win32-g++/qmake.conf
将-Wl,
宏中的QMAKE_LFLAGS_EXCEPTIONS_ON
移至QMAKE_FLAGS
中的适当位置:
QMAKE_LFLAGS = -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
将make.exe
复制到MinGW&#39} mingw32-make.exe
目录中的bin
,如果还不是mingw32-make.exe
然后构建Qt包括:
set QTDIR=<location of Qt source directory> # where configure.exe is
set PATH=%QTDIR%\bin;c:\MinGW\bin;%PATH%
set INCLUDE=
set LIB=
cd %QTDIR%
mingw32-make confclean # (this should fail the first time, since there's nothing to clean)
configure.exe -opensource -debug-and-release -nomake examples -nomake demos -nomake tests -platform win32-g++ # and accept the GPL license
mingw32-make
这需要一段时间......希望其他任何东西都不需要修补。
答案 1 :(得分:0)
我也遇到了这个问题。我是Qt n00b并且在安装Qt库时,“我已经安装了Mingw,所以我跳过安装Qt附带的Mingw”。这给了我一些问题。当安装Qt附带的mingw时,一切正常。
所以我向谷歌搜索这个问题的建议(就像我做的那样)是代替使用你已安装的Mingw,用Qt安装它并使用它(否则你必须在你的Mingw中构建Qt库,就像迈克尔伯尔回答)