1.起因
最近研究了arcGIS SDK for Qt,发现直接从官网下的Qt5.12二进制包不能直接用,从arcGIS模板新建的工程都会提示很多错误:
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
Google之后发现主要问题是Qt官方发布的二进制包出于授权的原因,没有链接OpenSSL的库(虽然bin目录里其实是有OpenSSL需要的两个dll的),在代码里输入下面3.4节的代码,出来的果然是不支持OpenSSL,需要自己从源代码里编译链接有OpenSSL的Qt才行。
PS: 折腾了两天成功编译了Qt之后,发现其实只要编译下OpenSSL,然后把编译好的OpenSSL的bin目录加入到系统Path变量里去,官方发布的二进制Qt其实就可以用了……吐血啊,不过自己编译了下Qt还是很有收获的,如果不是为了arcGIS,做一次静态编译出来的exe可以少带很多dll。
2.准备工作
2.1 软件环境
编译Qt需要很多工具,本人很反感装太多东西到C盘去,因此下面的工具除了必须的VS2017安装了之外,其他的都是绿色版,只要把这个工具路径加入到Path里去就可以了,完全没有问题。清单如下:
- MSVC2017 Community版(记得勾选上Win10 SDK)
- WinDbg,MS没有自带的话官网下载
- ActivePerl
- Ruby
- Python
- OpenSSL 1.0.2j
-
Qt5.12.0源代码
在D盘新建一个目录,存放所有需要的内容,整个编译的目录结构如下:
Qt-Build
– openssl-1.0.2j
---- OpenSSL64
– Perl64
– Python27
– Ruby26-x64
– qt-everywhere-src-5.12.0
注意openssl-1.0.2j目录下自己新建了一个OpenSSL64文件夹,用于存放编译好的OpenSSL的两个dll。
3.2 加入环境变量
把上面的Perl,Python,Ruby的bin目录都加入到系统Path里去。
3.3 检查配置
在命令行里分别执行下面几个命令,
perl -v
Python -v
Ruby -v
如果都正常的话即可进入正题。
3.编译Qt5.12
3.1编译OpenSSL1.0.2j
- 打开开始菜单-msvc2017-适用于VC2017的X64本机工具
- cd命令到openssl-1.0.2j下
-
perl Configure VC-WIN64A no-asm--prefix=D:/Qt-Build/openssl-1.0.2j/OpenSSL64 - 系统会检查编译配置是否正确,正确的话会输出Configuring for VC-WINA,确认有这句有输入命令
ms\do_win64a - 接着就可以编译了,输入
nmake -f ms\ntdll.mak - 等大概7,8分钟编译完成,我在编译过程中提升过几次Permision deny,没找到什么原因,继续输入上面的编译命令不管他,最后还是过了。
- 完成之后输入命令
nmake -f ms\ntdll.mak test - 系统测试完成后
nmake -f ms\ntdll.mak install - 这样就编译完成编译OpenSSL。
3.2 编译Qt
- 还是打开开始菜单-msvc2017-适用于VC2017的X64本机工具
- cd命令到openssl-1.0.2j下D:\Qt-Build\qt-everywhere-src-5.12.0目录下,注意很多教程让我们修改
\qtbase\mkspecs\common目录下msvc-desktop.conf这个文件里的编译选项QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MD QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD QMAKE_CFLAGS_DEBUG = -Zi -MDd为-MT,-MTd,对我们这个Qt for arcGIS SDK来说是不需要的,因为arcGIS的SDK就是需要动态链接,而是不是改了之后的静态链接。 - 执行命令
configure -platform win32-msvc2017 -opensource -confirm-license -prefix D:\Qt-Build\build-Qt5.12.0-msvc-64bit-dynamic -debug-and-release -opengl desktop -openssl-linked OPENSSL_PREFIX=D:\Qt-Build\openssl-1.0.2j\OpenSSL64 OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32 -llibeay32 -lssleay32" -nomake examples -nomake tests -no-direct2d -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdeclarative -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtscxml -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtsvg -skip qttranslations -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns注意build-Qt5.12.0-msvc-64bit-dynamic是最后输出结果文件夹,可以不创建,系统会自动生成,另外qtsensor和qtpositioning两个模块一定要带上,不能skip掉。 - 等待系统配置,注意查看OpenSSL有没有变成yes
- 所有的都配置好后
- 输入命令
nmake吧,等待大约1小时。 - 没有提示错误的话就输入命令
nmake install系统就会把编译好的拷贝到上面设定的目录build-Qt5.12.0-msvc-64bit-dynamic中去。 - 编译完成
3.3 配置Qt Creator
编译完成后还需要到Creator里配置这个新生成的库。
- 工具-选项-左侧选择
构建和运行-右侧选择构建套件-添加 - 在下面出现的表格里填写上自己起的刚编译好的套件名称,我起的是
Desktop Qt 5.12.0 MSVC2017 64 bit For arcGIS。 - 编译器选择amd64的.
- 调试器选择X64的
- Qt版本里点击右侧manage,选择刚生成的目录下的
qmake.exe
3.4 检查
新建一个arcGIS的Qt工程,输入代码检查是否已经支持OpenSSL
qDebug()<< QSslSocket::supportsSsl()<<QSslSocket::sslLibraryBuildVersionString()
<<QSslSocket::sslLibraryVersionString();
控制台输出正确信息
至此,全部编译结束。