【问题标题】:Static build of Qt Qt5Network linking errorQt Qt5Network 链接错误的静态构建
【发布时间】:2015-05-31 10:03:58
【问题描述】:

我正在尝试使用 OpenSSL 支持构建 Qt(版本 5.4.1)的静态构建。我是这样配置的:

configure -opensource -release -c++11 -static -platform win32-msvc2013 
-openssl-linked  -I C:\OpenSSL-Win32\include 
-L C:\OpenSSL-Win32\lib\VC\static
-nomake examples -nomake tests

include 和 lib 目录有效。我在Qt5Network.lib 中收到大量链接错误。

Qt5Network.lib(qhttpnetworkconnectionchannel.obj) : error LNK2019: unresolved ex
ternal symbol "public: static class QSharedPointer<class QSslContext> __cdecl QS
slSocketPrivate::sslContext(class QSslSocket *)" (?sslContext@QSslSocketPrivate@
@SA?AV?$QSharedPointer@VQSslContext@@@@PAVQSslSocket@@@Z) referenced in function
 "protected: void __thiscall QHttpNetworkConnectionChannel::_q_connected(void)"
(?_q_connected@QHttpNetworkConnectionChannel@@IAEXXZ)
Qt5Network.lib(qhttpprotocolhandler.obj) : error LNK2019: unresolved external sy
mbol "public: __int64 __thiscall QSslSocket::encryptedBytesToWrite(void)const "
(?encryptedBytesToWrite@QSslSocket@@QBE_JXZ) referenced in function "private: vi
rtual bool __thiscall QHttpProtocolHandler::sendRequest(void)" (?sendRequest@QHt
tpProtocolHandler@@EAE_NXZ)
C:\Qt\5.4\qtbase\bin\xmlpatterns.exe : fatal error LNK1120: 31 unresolved extern
als
jom: C:\Qt\5.4\qtxmlpatterns\tools\xmlpatterns\Makefile [release] Error 2
jom: C:\Qt\5.4\qtxmlpatterns\tools\Makefile [sub-xmlpatterns-make_first] Error 2

jom: C:\Qt\5.4\qtxmlpatterns\Makefile [sub-tools-make_first] Error 2
jom: C:\Qt\5.4\Makefile [module-qtxmlpatterns-make_first] Error 2

我之前能够在没有 OpenSSL 支持的情况下创建静态构建。错误消息还表明,该问题与 OpenSSL 有关。

有没有人想办法解决这个问题?

更新

这些配置产生相同的错误:

配置一:

configure -opensource -release -c++11 -static -platform win32-msvc2013 
-openssl-linked  -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32\lib\VC\static
 OPENSSL_LIBS="-llibeay32MT -lssleay32MT" -nomake examples -nomake tests

配置2:

configure -opensource -release -c++11 -static -platform win32-msvc2013 
-openssl  -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32
-nomake examples -nomake tests

更新 2

我也尝试过,所以按照qBittorrent wiki 中的精彩教程进行操作,得到了同样的错误。

如果这确实是一个 Qt 错误,正如弗兰克在 his comment 中所建议的那样,如果有人能推荐 Qt 的最后一个版本,这也将非常有用。

更新 3

bugreports.qt.io 我收到了意见,这不是一个错误:

您实际上并没有告诉构建链接 openssl 库。 http://doc.qt.io/qt-5/ssl.html 给出了以下示例:

OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl 链接

您需要针对您的编译器和库位置进行调整 当然。

在参考文档页面上给出了这个例子:

OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl-linked

我在我编译的 OpenSSL 版本中找不到 ssl 或加密库,也没有在二进制分发中找到。我确实有标题。我只有 ssleay32 和 libeay32 库。

configure 命令确实提示将这些库设置为提到的变量:

NOTE: When linking against OpenSSL, you can override the default
library names through OPENSSL_LIBS
and optionally OPENSSL_LIBS_DEBUG/OPENSSL_LIBS_RELEASE
For example:
    configure -openssl-linked OPENSSL_LIBS="-lssleay32 -llibeay32"

通过设置这个变量,我仍然会遇到同样的错误。

更新 5

不完全是我想要的,但向前迈进了一步:

我已经下载了最近(4 天前)发布的 Qt 5.4.2 的源代码,并且我能够使用动态链接的 OpenSSL(-openssl 开关)创建静态构建。

我仍在寻找静态链接 OpenSSL 的解决方案。我仍然有相同的链接错误。

【问题讨论】:

  • 很可能是一个 Qt 错误,那么值得在 Qt JIRA 中报告它。当说“Qt 5.4”时,你是指 5.4.0 还是 5.4.1?
  • @FrankOsterfeld 谢谢,我已将其报告为错误。 bugreports.qt.io/browse/QTBUG-46405 我的意思是 5.4.1,不准确之处见谅。
  • @FrankOsterfeld 我得到的答案是这不是一个错误,但我个人还没有完全确定它。你能推荐一个 Qt 版本吗?
  • " 在我编译的 OpenSSL 构建中找不到 ssl 或加密库" 好吧,先解决这个问题,然后你的问题与 Qt 无关。
  • @KubaOber 说起来容易做起来难。我已经下载了 OpenSSL for Windows 的官方二进制发行版,它不包含它。我不知道我能做些什么。

标签: c++ qt deployment compilation static-linking


【解决方案1】:

这就是我使用 MSVC 2013 在 Windows 上构建具有 SSLMySQL 支持的 Qt 5.7.1 的方法:

确保可以在 PATH 环境变量中找到 Perl、Python 和 Ruby。

从 github 存储库下载 Qt:

cd C:\Qt
git clone https://github.com/qt/qt5.git
cd C:\Qt\qt5 
git checkout 5.7 

确保签出提交36e7cff94fbb4af5d8de6739e66164c6e6873586。此时,签出 5.7 正是这样做的。

将以下内容放在位于C:\Qt\qt5qt5vars.bat 中。如果需要,请进行调整:

@echo off

REM Set up \Microsoft Visual Studio 2015, where <arch> is \c amd64, \c x86, etc.
CALL "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86

REM Edit this location to point to the source code of Qt
SET _ROOT=C:\Qt\qt5

SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH%

REM Uncomment the below line when using a git checkout of the source repository
SET PATH=%_ROOT%\qtrepotools\bin;%PATH%

REM Uncomment the below line when building with OpenSSL enabled. If so, make sure the directory points
REM to the correct location (binaries for OpenSSL).
SET PATH=C:\OpenSSL-Win32\bin;%PATH%

REM When compiling with ICU, uncomment the lines below and change <icupath> appropriately:
REM SET INCLUDE=<icupath>\include;%INCLUDE%
REM SET LIB=<icupath>\lib;%LIB%
REM SET PATH=<icupath>\lib;%PATH%

REM Contrary to earlier recommendations, do NOT set QMAKESPEC.

SET _ROOT=

REM Keeps the command line open when this script is run.
cmd /k

之后,执行此文件并正确启动存储库:

qt5vars.bat 
perl init-repository

最后,要成功配置和编译库(带有调试和发布版本),请确保 configure 引用的路径在您的系统上也有效:

configure -static -static-runtime -debug-and-release -ssl -openssl -openssl-linked -qt-sql-mysql -opengl dynamic -platform win32-msvc2013 -prefix C:\Qt\qt5.7-msvc2013-static -nomake tests -nomake examples -I "C:\Program Files (x86)\MySQL\MySQL Connector.C 6.1\include" -I "C:\OpenSSL-Win32\include" -L "C:\Program Files (x86)\MySQL\MySQL Connector.C 6.1\lib" -L "C:\OpenSSL-Win32\lib\VC\static" OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32 -lCrypt32" OPENSSL_LIBS_DEBUG="-lssleay32MTd -llibeay32MTd" OPENSSL_LIBS_RELEASE="-lssleay32MT -llibeay32MT"
nmake
nmake install

到目前为止,一切都应该顺利而优美地运行。现在只需配置 Qt Creator 以检测这个新的 Qt 版本创建一个新的 Kit 以用于您的项目:

【讨论】:

    【解决方案2】:

    前段时间我不知何故让它在 Qt 5.3 上运行得非常快:

    configure -static -debug-and-release -platform win32-msvc2012-mt -openssl -I %OPENSSL_HOME%\include -L %OPENSSL_HOME% -nomake examples -nomake tests -confirm-license -opengl es2 -skip qtwebkit -skip qtwebkit-examples -skip qttools
    

    其中 -platform win32-msvc2012-mt 指向 -MT 编译器选项 makespec,因此应用程序也使用 MT。还要让它在应用程序 .pro 文件中运行:

    LIBS += -L$$PWD/../third-party/openssl/lib -llibeay32MT
    LIBS += -L$$PWD/../third-party/openssl/lib -lssleay32MT
    

    请务必在静态 Qt 构建尝试之间重新安装整个 Qt Src 目录,据我观察,总是很难跟踪在新运行中破坏所有内容的剩余内容。

    并且 OPENSSL_HOME 变量设置为 ProjectDir\third-party\openssl

    【讨论】:

      【解决方案3】:

      我刚刚花了大约一天的时间处理那个静态构建,对我有用的是:

      https://github.com/alberthdev/alberthdev-misc/wiki/Building-Qt-v5.6-Statically-on-Windows

      另外,你必须注意到我使用了openssl-1.0.1r,因为新版本的构建算法和.dll名称在指令中不同,所以指令算法不适用于它们,openssl-1.0.1r没有被弃用,所以它没关系。

      我也遇到了 building.bat 脚本的问题,所以这里有一个以适当的方式为我工作的脚本:

         ..\qt-5.8.0\configure -opensource -confirm-license^
         -prefix C:\Qt\Qt5.8.0-static^
         -debug-and-release -ssl -openssl -openssl-linked -opengl dynamic^
         -static -static-runtime -platform win32-msvc2015^
         -no-compile-examples -nomake examples^
          -L C:\OpenSSL-win32\lib -I C:\OpenSSL-win32\include OPENSSL_LIBS="-llibeay32 -lssleay32"
      

      请注意,我的“Build”目录不在“qt-5.8.0”目录中,所以请更正路径 ..\qt-5.8.0\configure 以适应您的文件结构。正如链接下的说明中所述,所有其他步骤均已明确进行。

      【讨论】:

        【解决方案4】:

        这是一个老问题,但我会给出答复 这取决于 open ssl 的版本。如果您使用的是 1.1.0 以下的版本,上述顺序可能没问题,但是根据我的经验,使用 1.1.1 不需要 OPENSSL_LIBS="-LC:\OpenSSL-Win32\lib -lssl -lcrypto"。配置后,有一个名为 QtNetowrk 的项目,它显示是否检测到 openssl 库。以下适用于 1.1.1 static 和 qt 5.12.4

        set OPENSSL_HOME=C:\OpenSSL-Win32
        
        ..\configure -static -debug-and-release -platform win32-msvc2019 -static-runtime -ssl -openssl -openssl-linked -I %OPENSSL_HOME%\include -L %OPENSSL_HOME%\lib
        

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题,我认为问题是我们首先在没有 ssl 的情况下构建,并且没有重新生成 src/network/Makefiles

          当我删除它们并再次运行配置时,我通过了

          希望对你有帮助

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-21
            • 1970-01-01
            • 1970-01-01
            • 2012-10-05
            • 2011-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多