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才行。
基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译

PS: 折腾了两天成功编译了Qt之后,发现其实只要编译下OpenSSL,然后把编译好的OpenSSL的bin目录加入到系统Path变量里去,官方发布的二进制Qt其实就可以用了……吐血啊,不过自己编译了下Qt还是很有收获的,如果不是为了arcGIS,做一次静态编译出来的exe可以少带很多dll。

2.准备工作

2.1 软件环境

编译Qt需要很多工具,本人很反感装太多东西到C盘去,因此下面的工具除了必须的VS2017安装了之外,其他的都是绿色版,只要把这个工具路径加入到Path里去就可以了,完全没有问题。清单如下:

  1. MSVC2017 Community版(记得勾选上Win10 SDK)
  2. WinDbg,MS没有自带的话官网下载
  3. ActivePerl
  4. Ruby
  5. Python
  6. OpenSSL 1.0.2j
  7. 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

  1. 打开开始菜单-msvc2017-适用于VC2017的X64本机工具
  2. cd命令到openssl-1.0.2j下
  3. perl Configure VC-WIN64A no-asm --prefix=D:/Qt-Build/openssl-1.0.2j/OpenSSL64基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  4. 系统会检查编译配置是否正确,正确的话会输出Configuring for VC-WINA,确认有这句有输入命令ms\do_win64a 基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  5. 接着就可以编译了,输入nmake -f ms\ntdll.mak 基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  6. 等大概7,8分钟编译完成,我在编译过程中提升过几次Permision deny,没找到什么原因,继续输入上面的编译命令不管他,最后还是过了。
  7. 完成之后输入命令nmake -f ms\ntdll.mak test
  8. 系统测试完成后nmake -f ms\ntdll.mak install 基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  9. 这样就编译完成编译OpenSSL。

3.2 编译Qt

  1. 还是打开开始菜单-msvc2017-适用于VC2017的X64本机工具
  2. 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就是需要动态链接,而是不是改了之后的静态链接。
  3. 执行命令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是最后输出结果文件夹,可以不创建,系统会自动生成,另外qtsensorqtpositioning两个模块一定要带上,不能skip掉。基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  4. 等待系统配置,注意查看OpenSSL有没有变成yes 基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  5. 所有的都配置好后基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  6. 输入命令nmake吧,等待大约1小时。
  7. 没有提示错误的话就输入命令nmake install系统就会把编译好的拷贝到上面设定的目录build-Qt5.12.0-msvc-64bit-dynamic中去。
  8. 编译完成

3.3 配置Qt Creator

编译完成后还需要到Creator里配置这个新生成的库。

  1. 工具-选项-左侧选择构建和运行-右侧选择构建套件-添加
  2. 在下面出现的表格里填写上自己起的刚编译好的套件名称,我起的是Desktop Qt 5.12.0 MSVC2017 64 bit For arcGIS
  3. 编译器选择amd64的.
  4. 调试器选择X64的 基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
  5. Qt版本里点击右侧manage,选择刚生成的目录下的qmake.exe 基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译

3.4 检查

新建一个arcGIS的Qt工程,输入代码检查是否已经支持OpenSSL

qDebug()<< QSslSocket::supportsSsl()<<QSslSocket::sslLibraryBuildVersionString()
            <<QSslSocket::sslLibraryVersionString();

控制台输出正确信息
基于MSVC2017+OpenSSL1.0.2j的Qt5.12.0 for arcGIS Qt SDK动态编译
至此,全部编译结束。

参考文献

  1. 用MSVC2015编译Qt5.6(包含openssl、webengine)
  2. 静态编译OpenSSL并整合到Qt

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-05-27
  • 2021-04-18
  • 2021-08-07
  • 2021-07-02
  • 2022-12-23
  • 2021-05-13
猜你喜欢
  • 2021-04-13
  • 2021-06-10
  • 2021-09-22
  • 2022-12-23
  • 2021-04-28
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案