Windows平台 Qt 5.9 VS2017 静态编译 包括OpenSSL、ICU

来源:互联网 发布:淘宝首页制作图 编辑:程序博客网 时间:2024/05/22 10:26

Windows平台 Qt 5.9 VS2017 静态编译

  • Windows平台 Qt 59 VS2017 静态编译
    • 总览
    • ICU
    • OpenSSL
    • Qt 编译

总览

这篇文章会简单介绍一下Qt 5.9使用VS2017静态编译的过程以及可能遇到的问题的解决方法。首先是依赖,与运行不同,Qt在编译的时候会有一些其它依赖。请安装好它们并且添加至环境变量

  • Perl version 5.12 or later,下载
  • Python version 2.7 or later,下载
  • Ruby version 1.9.3 or later,下载

除了上述依赖之外,Qt还有一些可选的外部库依赖,一些库在Qt源码中已经提供,我们只需要在配置的时候指定一下就好,一些并没有提供,需要自己下载别人编译好的或者需要自己编译。目前有两项,分别是ICUOpenSSL。我会在下面简单介绍他们的作用和编译方法。不过可惜的是虽然我编译成功了ICU,但是在配置Qt的时候一直过不了ICU的检查。后来我换成别人已经编译好的,依然过不了检查,所以ICU的编译过程应该没有问题,问题出在了Qt的配置上面,暂时还没有找到解决办法。辛辛苦苦写好的ICU编译教程又不舍得删,所以留在了下面 ICU的问题已经用一个不太漂亮的办法解决了,大家可以放心看了……

ICU

关于ICU在Qt中的作用,官方是这样介绍的:

ICU: Qt 5 can make use of the ICU library for enhanced UNICODE and Globalization support (see QTextCodec, QCollator::setNumericMode()).

让Qt使用ICU库的话会有下面的好处:

  • Behavior matches other platforms more closely.
  • Extended set of text codecs (see QTextCodec).
  • QLocale::toUpper(), QLocale::toLower() always use case conversion rules specific to the locale.
  • QCollator::setNumericMode() does work consistently on all Windows versions.

如果上面几项中没有你感兴趣的内容的话,就可以跳过这一节。

下面开始介绍ICU的编译,在ICU官网中,会提供用VS2015编译好的版本,不过因为我们使用VS2017,而且要静态编译,所以还是手动来一次。下载最新的ICU4C源代码。源代码下载

首先介绍依赖,ICU在配置编译选项时需要使用MSYS,原版的MSYS安装很麻烦,这里推荐另一个基于MSYS的东西,git-bash,一般安装了git的话都会有这个工具(下载地址)。在git的安装目录下就可以看到。另外,虽然是用VS编译,但是中间会用到MinGw的构建工具make(并不会用到gcc或者g++),所以还是会依赖MinGw,所以请确保MinGw已经被添加进环境变量。

准备好这些之后就可以开始编译了,在这里我们以32位为例。开始 -> Visual Studio 2017 -> x86 Native Tools Command Prompt for VS 2017(如果是64位的话就是x64),打开后会自动设定好VS相关的环境变量,然后在输入git-bash的路径打开git-bash(为什么要这样打开git-bash呢?因为git-bash无法运行针对Windows的bat,所以我们先在CMD中用微软写好的bat设置好环境变量之后在打开git-bash,就会自动继承已经设置好的VS环境变量,就不需要我们自己去再设置环境变量了),切换到icu/source,输入

CFLAGS=-MT CXXFLAGS=-MT ./runConfigureICU MSYS/MSVC --enable-static --disable-shared --prefix=$QTDIR/ICU

其中MSYS/MSVC意思是对应平台,–enable-static –disable-shared意思是编译静态库,不编译动态库。–prefix参数指定的是最后的安装目录,我为了方便,自己提前设置好了一个QTDIR这个参数。大家可以选择自己喜好的路径。

运行之后如果遇到下面报错

configure: error: link.exe is not a valid linker. Your PATH is incorrect.Please follow the directions in ICU’s readme.

是因为git-bash的环境变量中本身有link,而且又在靠前的位置,导致它找到的是自己的link而不是微软的link。大家可以输入

which link

查看当前的link是哪一个link,如果是来自/usr/bin/link的话,那就说明有问题。这里有一个简单的解决办法,我们打开git的安装目录,找到/usr/bin下面的link.exe,把它改成另一个名字,然后按照上述步骤重启git-bash。记得最后要改回来。当然,你也可以自己修改环境变量,只是很麻烦。正确的link应该是在运行了上面的which语句后返回

/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x86/link

(这里是32位,64位的话就是把x86改为x64)
运行结束之后如果遇到下面的警告

** WARNING: make may not be GNU make.This may cause ICU to fail to build. Please make sure that GNU makeis in your PATH so that the configure script can detect its location.*** WARNING: Archiver ar not found. Set AR= or fix PATH. Some builds (such as static) may fail.
checking the version of “make”… ./configure: line 9024: make: command not found
too old or test failed - try upgrading GNU Make

说明MinGw并没有添加入你的环境变量,把mingw32-make改名为make,添加MinGw到环境变量。

确保一切没有问题之后输入

make

编译完成之后,为了验证,可以输入

make check

看到All test OK的话就说明没问题了,运行

make install

另外,如果你在编译Qt的时候想同时包括debug和release版本的话,就必须再给ICU编译一个debug版本(并不知道为什么OpenSSL不需要),编译的步骤和上面一摸一样,只是在第一步配置的时候得要加上参数–enable-debug,并且将MT改成MTd,编译出来的lib文件不会冲突,因为命名的时候会加上后缀d。(有人说直接把以前的lib文件复制一份,修改名字在后面加上d就好,我不清楚可不可以……大家可以去试试……不过不建议这么做)

ICU的编译到此为止。

OpenSSL

关于OpenSSL在Qt中的应用,官方是这样介绍的:

Support for Secure Sockets Layer (SSL) communication is provided by the OpenSSL Toolkit, which must be obtained separately. See Secure Sockets Layer (SSL) Classes for instructions on building Qt with SSL support.

具体内容大家可以点进去看,如果要做网络开发的话,基本都是必要的。如果不需要的话可以跳过此节

官方标注的Windows10 64位依赖的OpenSSL版本为1.0.2j,32位为1.0.2h1。
编译OpenSSL时依赖Perl,上面已经提供了下载。

以32位为例。开始 -> Visual Studio 2017 -> x86 Native Tools Command Prompt for VS 2017(如果是64位的话就是x64),打开后会自动设定好VS相关的环境变量,切换到OpenSSL源代码所在路径,输入

perl Configure VC-WIN32 no-asm --prefix=%QTDIR%/OpenSSL

其中VC-WIN32是对应平台,如果是64位的话就是VC-WIN64A(当然,如果你要用得是英特尔的安腾系列64位处理器的话就是VC-WIN64I了,但是我想应该没有人用……),no-asm的意思是不使用汇编代码,如果用的话会出现许多奇奇怪怪的问题。–prefix参数指定的是最后的安装目录,我为了方便,自己提前设置好了一个QTDIR这个参数。大家可以选择自己喜好的路径。

之后输入

ms\do_ms

之后,因为我们是静态编译,所以输入

nmake -f ms\nt.mak

之后为了验证,可以输入

nmake -f ms\nt.mak test

看到passed all tests的话说明没有问题,可以继续,输入

nmake -f ms\nt.mak install

OpenSSL的编译到此为止。

Qt 编译

打开Qt源代码路径下面的qtbase\mkspecs\common\msvc-desktop.conf,会注意到有这么几行

QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd

将三个MD都改成MT,然后保存,即

QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd

之后,依然 开始 -> Visual Studio 2017 -> x86 Native Tools Command Prompt for VS 2017(如果是64位的话就是x64),打开后会自动设定好VS相关的环境变量,切换到Qt源代码所在路径,输入

configure -confirm-license -opensource -debug-and-release -static -force-debug-info -prefix %QTDIR% -qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -nomake examples -nomake tests -opengl dynamic -openssl-linked -icu -platform win32-msvc OPENSSL_PREFIX=%QTDIR%\OpenSSL OPENSSL_LIBS="-lssleay32 -llibeay32 -lgdi32" ICU_PREFIX=%QTDIR%\ICU ICU_LIBS_DEBUG="-lsicudtd -lsicuind -lsicuucd -lAdvapi32" ICU_LIBS_RELEASE="-lsicudt -lsicuin -lsicuuc -lAdvapi32"

-confirm-license -opensource是使用开源协议。
-debug-and-release是同时编译debug版和release版
-force-debug-info是即使在release模式下也有调试符号
-static是编译静态库
-prefix是最后的安装路径
-qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype这些的意思是使用Qt源码中自带的这些第三方库
-nomake examples -nomake tests就是字面意思,不编译example和tests
-opengl dynamic这个官方建议的参数,意思是根据系统情况在运行时动态的选择opengl运行模式,可能会使用ANGLE或者opengl或者都不使用。参考http://doc.qt.io/qt-5/windows-requirements.html#graphics-drivers
-openssl-linked 包括OpenSSL库
-icu 包括icu库
-platform win32-msvc 平台选择

如果你和我一样遇到了ICU check不通过的情况,这里有一个不太漂亮的解决办法,打开qtbase\mkspecs\features\qt_configure.prf,在大约第180行,会看到

defineTest(qtConfLibrary_inline)

函数体里面有

lib = $$eval($${1}.library)!defined($${1}.libs, var): \    error("'inline' source in library '$$lib' does not specify 'libs'.")

把这一段改成

lib = $$eval($${1}.library)equals(lib, icu){    $${1}.libs = "-lsicudt -lsicuin -lsicuuc -lAdvapi32"}!defined($${1}.libs, var): \    error("'inline' source in library '$$lib' does not specify 'libs'.")

就好了

接着,就可以编译了,输入

nmake

如果你想编译快一点的话,可以使用Qt官方推出的代替nmake的工具jom,一般如果你安装过Qt Creator的话都可以在Qt Creator的bin目录下面找到jom.exe。jom的用法和nmake完全一样,你只要把nmake相关指令替换为jom就好,它拥有更好的多线程性能。之后就是等了。

完成之后输入

nmake install

这一步会比编译快很多。结束之后打开Qt Creator,在设置的构建与运行中先添加Qt Version,选择刚刚编译好的Qt的qmake。之后添加构建套件,版本选择我们刚刚添加的那个,编译器选择VS就好。之后就可以使用了。
Qt Version设置

构建套件设置


  1. http://wiki.qt.io/Qt_5.9_Tools_and_Versions/
    虽然1.0.x版本似乎都没问题,但是还是按照官方要求的来比较稳妥。注意,1.1.x版本是不行的。源代码下载 ↩
原创粉丝点击