转载自:https://blog.csdn.net/u011964923/article/details/52886908
为了解决的问题:QT动态编译得到的exe可执行文件,只能在本机运行。若直接复制到一台未安装QT的计算机上,肯定是无法运行的。
解决方法一:请参照我的另一篇博客QT程序 如何在未安装QT的电脑上运行,该方法仍然采用动态编译的方式,只是采用QT提供的windeployqt命令将可执行文件所需的动态链接库全给扒出来,然后放到可执行文件同一目录中,便可以拿到另外一台计算机上执行了。 缺点是:动态链接库太多,40MBit左右。
本文提供解决方法二:静态编译的方式:
本文假设您已成功安装 qt-opensource-windows-x86-msvc2013_64-5.7.0.exe 和 qt-vs-addin-1.25.exe(均可以在官网下载到)
【步骤1】在计算机上安装python库和perl库(因为后续的静态编译需要用到这两种语言),可以在命令行敲击“python”和“perl -v”检查是否安装成功。
【步骤2】下载qt-everyshere-opensource-src-5.7.0-beta.zip 解压到 C:\FreqUsed\Qt\qt-everywhere-opensource-src-5.7.0-beta(按照自己习惯的路径解压)
下载链接:http://ftp.vim.org/languages/qt/archive/qt/5.7/5.7.0/single/
【步骤3】打开 C:\FreqUsed\Qt\qt-everywhere-opensource-src-5.7.0-beta\qtbase\mkspecs\common\msvc-desktop.conf
将
QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd
改为
QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd
即将MD改成MT,MDd改成MTd。动态改成静态
【步骤4】打开Visual Studio Tools中的 VS2013 开发人员命令提示,cd进入 C:\FreqUsed\Qt\qt-everywhere-opensource-src-5.7.0-beta
输入指令:
configure -confirm-license -opensource -platform win32-msvc2013 -debug-and-release -static -prefix "C:\FreqUsed\Qt\-static-vs2013" -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples
回车等待1分钟左右
其中,"C:\FreqUsed\Qt\-static-vs2013"是我接下来把静态编译版本qt的安装目录
(这一步真是血淋淋的教训,我按照网上QT5.4.0的配置方法,区别为QT5.4.0配置代码最后有“-skip qtwebkit”。到了Qt5.7.0版本,这个qtwebkit早就被拿掉了,所以要去掉“-skip qtwebkit”。就因为这个,浪费了我一整天,时间就是金钱啊)
【步骤5】1分钟之后,命令行会提醒你nmake,那么我们键入nmake命令并回车,等待2至3个小时后,再输入nmake install,便可以发现"C:\FreqUsed\Qt\-static-vs2013"这个目录正在安装文件,等带10分钟后,安装完毕。
【Qt Creator下的配置】 在工具->选项中...添加QT Version和构建套件,然后建立工程即可。
【VS下Qt插件的配置】网上的配置方法太过复杂,且成功率很低。让我纠结了一个下午,突然灵光一现,下面是我的方法:
1、先利用Qt Creator建立一个static版本的工程,设计好界面之后,编译成功。
2、将静态编译debug或release文件夹下的 “工程名_plugin_import.cpp”,复制到工程的main文件同一目录下
3、用VS的QT5打开刚才建立的工程,qt setting设置为静态版本
4、编译成功
结束语:静态编译后的exe可执行文件不再需要动态链接库,所以只需要一个exe文件就可以跑遍任何一台电脑,还是蛮爽的。
附录:依赖软件
显卡驱动
QtQuick2.0需要OpenGL 2.1或者更高版本的支持,而QtQuick 2.0我没有使用过,也未找到方法可以不安装。Windows的默认驱动中只支持OpenGL 1.1,并不满足Qt的需求。
Qt5的源码中包含了作为OpenGL ES2.0 API和DirectX 9之间桥梁的ANGLE,如果系统中包含了DirectXSDK(Windows SDK中包含,安装VS时会附带上),则可使用ANGLE作为OpenGL选项来编译。ANGLE是编译Qt过程中OpenGL选项的默认项。
另外也可选择自己安装的OpenGL驱动,配置Qt时将OpenGL选项修改即可。
如果使用的是VS2012,编译Qt时使用ANGLE,则会非常麻烦。VS2012默认编译出的程序是无法在XP上运行的,只有升级到VS2012 SP1后,在工程的属性页,选择配置属性-常规-平台工具集为Visual Studio 2012 – Windows XP (v110_xp)后编译出的程序才可在XP上运行。平台工具集表示的应该是编译程序所使用的库,选择v110_xp工具集,表示使用Windows SDK 7.1A,而默认情况下使用的是版本8.x。
我之前使用VS的命令行方式编译的Qt,使用Qt默认的OpenGL选项ANGLE,未指定平台工具集,一方面由于ANGLE的问题,虽然我并未使用、依赖的库也并未使用OpenGL相关函数,可工程(实际上是Qt库)仍需依赖DirectX库;另一方面,我使用的Qt是在默认平台工具集下编译的,依赖的DirectX的Windows SDK版本为8.x,而我要使我的程序可以在XP上运行,就需要将平台工具集更改为v110_xp,此时只能找到Windows SDK 7.1A,就无法找到依赖的Windows SDK 7.1中不存在的dxguid.lib、d3dcompiler.lib库了。
顺便说一句,VS2010带的Windows SDK版本为7.1。
而手工添加库文件的位置想想就是让人痛苦的工作。只好重新编译Qt,使用自行安装的OpenGL,而不是ANGLE。也可以用v110_xp编译Qt,这样仍可使用ANGLE。
另外QtWebKit还依赖ICU库。我没有使用这个模块,因此并未去了解。