静态编译Qt5.5并应用成果

2023-07-06 13:51:00 浏览数 (1)

静态编译Qt5.5并应用成果

一直为打包Qt开发的东东依赖库发愁。只好研究下静态编译,当然选个最新的版本。

环境如下:

win7 x86

VS2012

perl5.16.2

python34(32bit)

ruby21

Qt5addin1.2.4

说明:ruby安装时要把三个都选择上,QT5addin插件安装要特有耐心,不然总会觉得,程序假死了。(后来发现是装集成help文档时占时间,可以不装它的)

以上安装在一个独立的虚机,方便以后改造,重要的一点是,一编译就2-3个小时,你对着屏发呆嘛?

下载Qt5.5的源码,进入其目录,需要改的有两处:

<src目录>qtbasemkspecswin32-msvc2012qmake.conf.

将以下三处 -MD修改为 -MT

QMAKE_CFLAGS_RELEASE = -O2 -MT

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -O2 -MT -Zi

QMAKE_CFLAGS_DEBUG = -Zi -MTd

当环境不同,聪明的你会找到需要更改的位置。5.5源码包是mkspecs/comon/msvc-desktop.conf里面改。

建立个批处理文件,如vs2012.build.bat

内容如下:

::配置路径

set QT5_DIR=C:qt_toolqt-everywhere-opensource-src-5.5.0-alpha

set THIRDPARTY_DIR=C:qt_toolBuild

::如果您用mingw可以在这儿设置下您的mingw目录

set PATH=%PATH%;C:Perlsitebin;C:Perlbin;C:Python34;C:Ruby21bin;

set PATH=%PATH%;%QT5_DIR%bin;%QT5_DIR%qtbasebin;%QT5_DIR%gnuwin32bin;

::配置依赖,mingw的可能需要您手动加上库和头文件位置,vs的话您可以打开相应的VS* X86/64 本机命令提示符

::set SQLITE3SRCDIR=%THIRDPARTY_DIR%sqlite

::set LIB=%LIB%;%THIRDPARTY_DIR%icuwin32lib;%THIRDPARTY_DIR%icuwin32libs;%THIRDPARTY_DIR%opensslopenssl32lib

::set INCLUDE=%INCLUDE%;%THIRDPARTY_DIR%icuwin32include;%THIRDPARTY_DIR%opensslopenssl32include

::set PATH=%PATH%;%THIRDPARTY_DIR%icuwin32bin;%THIRDPARTY_DIR%opensslopenssl32bin

::配置QT,为了在输入configure配置qt编译选项,我就直接写到bat了、、、

cd %QT5_DIR%

configure -prefix C:QtSdkWin32_static -opensource -confirm-license -static -platform win32-msvc2012 -release -c 11 -qt-sql-sqlite -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -no-angle -no-icu -opengl desktop -nomake examples -nomake tests -no-compile-examples -skip qtwebkit

把它保存。不提倡改那个bat文件,因为,webkit是不能静态编译的,并且它很耗时,并且很多选项都是经验之谈。

然后,找nmake去。在开始菜单里找”vs2012 x86本机工具命令指示行“,

打开,进入源码目录,执行批处理。

你的环境一致,定能configure过。注意,要清除前一次的垃圾,需要用nmake distclean

后面的事就是敲nmake,泡杯茶了。

有时,你真的nmake成功了,但是不一定能nmake install正常。但我坚信install只是一系列拷贝操作。你要的那些lib已经OK了,你可以部署的时候再用他们。

当然,你可以坚持找原因,nmake install成功。

注意,不要轻易改变源码的位置,或节省空间删除它。否则,上帝保佑你。

后记:

以为装了Qt5addin,打开就可以看到Qt5的菜单,错了,还要真的装个Qt sdk才行。

Qtcreator静态编译了一下,的确可用,但是无法部署到同为32的xp下。可能是因为,Qt使用的编译器仍然是VS2012的,所以,再用VS2012 Qt5addin试一次,何况这是我们目标。

不过,我发现一个坑,Qt5addin1.2.4根本和VS2012不兼容,而且这不会提示你。

1.2.3装后,开始真正的应用静态编译的成果了。

项目设置:

为了让exe能跑在xp上,需要设置在工程—-属性—配置属性–常规–平台工具集v110_xp

因为,我编译的lib都是realse的,所以把项目设成realse

改成(release为MT,debug为MTD)

在工程—-属性—配置属性—c/c —代码生成—-运行库

选择为“多线程(/MT)”

这样设置可能是约定了对lib的调用方式。

否则,编译时报错:runtimelibrary

error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”

在工程—-属性—配置属性—链接器

本人的附加依赖项(备忘):$(QTDIR)libQt5Core.lib;$(QTDIR)libQt5Gui.lib;$(QTDIR)libqtmain.lib;$(QTDIR)libQt5Widgets.lib;$(QTDIR)pluginsplatformsqwindows.lib;$(QTDIR)libQt5PlatformSupport.lib;$(QTDIR)pluginsplatformsqminimal.lib;$(QTDIR)pluginsplatformsqoffscreen.lib;$(QTDIR)libQt5OpenGL.lib;$(QTDIR)libQt5OpenGLExtensions.lib;$(QTDIR)libQt5Sql.lib;winspool.lib;shlwapi.lib;rpcrt4.lib;$(QTDIR)pluginsimageformatsqico.lib;$(QTDIR)pluginsimageformatsqsvg.lib;$(QTDIR)libQt5Qml.lib;$(QTDIR)libQt5Quick.lib;comdlg32.lib;oleaut32.lib;imm32.lib;winmm.lib;glu32.lib;opengl32.lib;gdi32.lib;$(QTDIR)libqtharfbuzzng.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;ole32.lib;advapi32.lib;ws2_32.lib;mpr.lib;%(AdditionalDependencies)

上面配置解决了一个ub_buffer_create……destroy啥的编译错误。

QT5设置:

VS中设置好Qt versions为静态的sdk,然后在Qt project setting—–properties页的最后一个设置上。

即version属性选择下拉中的静态sdk(有时忘记它,其实主要开关在这里)

最后构建你的程序吧。不过还是有坑的。虽然没有报error了,但当你运行它会提示你:

……Failed to load platform plugin windows……

这次改main.cpp吧

#include

Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

编译通过,这次把exe放到没有Qt5安装的xp下,都如愿运行,出画面了。

大胆的写Qt吧,一次编写,到处部署(很方便)

发布于 2015年4月3日作者 resumeadmin分类 Qt、利器与技巧标签 Qt5、qt5addin、vs2012、xp部署、静态编译

《静态编译Qt5.5并应用成果》有6个想法

0 人点赞