【问题标题】:Qt 5.4 static build produces "unresolved external symbol" link error in Visual Studio 2013Qt 5.4 静态构建在 Visual Studio 2013 中产生“未解析的外部符号”链接错误
【发布时间】:2015-01-03 21:32:38
【问题描述】:

我想使用 Qt 5.4 的静态版本。由于没有可用的预编译静态构建,您必须自己从 Qt 源代码构建一个。

我的环境如下:

  • Windows 7 x64
  • Visual Studio 2013 终极更新 4
  • Qt5 Visual Studio 插件 1.2.4
  • 已安装 ActivePerl / ActivePython(构建 Qt 源代码所需)

我的过程如下(参见 Qt 文档 > Qt 5.4 > Qt for Windows - 从源代码构建):

  • 下载qt-everywhere-opensource-src-5.4.0.zip
  • 解压到临时文件夹
  • here 所述打开命令提示符(基本上,这类似于打开“Visual Studio 命令提示符”并向路径变量添加一些路径)
  • 使用以下命令运行配置

    configure -c++11 -mp -release -static -nomake tests -nomake examples -prefix D:\Qt\qt-5.4.0-x86-msvc2013-compact-static -platform win32-msvc2013 -opengl desktop -no-icu -skip webkit
    
  • 运行nmakenmake install

所有这些都没有错误地运行。

然后在 Visual Studio 中,我将现有 Qt 项目的 Qt 版本更改为 D:\Qt\qt-5.4.0-x86-msvc2013-compact-static,因为这是上述过程的输出文件夹。

但是,现在我收到大量以下类型的未解决符号错误(构建配置“发布”):

error LNK2001: unresolved external symbol "__imp__glBindTexture@8". Qt5Gui.lib(qopenglfunctions.obj)
...
error LNK2001: unresolved external symbol "_hb_blob_create".    Qt5Gui.lib(qharfbuzzng.obj)
...
error LNK2001: unresolved external symbol "_hb_face_create_for_tables". Qt5Gui.lib(qharfbuzzng.obj)
....
error LNK2001: unresolved external symbol "_WSAAsyncSelect@16". Qt5Core.lib(qeventdispatcher_win.obj)

具有类似选项 (-platform win32-msvc2013 -opengl desktop -no-icu -skip webkit) 的共享库/动态链接构建工作正常。

我做错了什么?


1 月 6 日更新:

1) 正如在 cmets 中已经提到的,这可能是 Qt 中的一个错误,所以我创建了一个错误报告 (QTBUG-43636),后来我发现了一个可能相关的错误 (QTBUG- 38913)。 (抱歉,我最多只能发布 2 个链接)

2) 我发现(感谢 karlphillip)如果在 Visual Studio 中将一些库添加到附加依赖项中,可以减少错误消息的数量

  • Ws2_32.lib 解决了一条错误消息(共 103 条)
  • opengl32.lib 解决 47 条错误消息

这意味着现在“只有”55 error messages left。也许还有更多的库丢失?

【问题讨论】:

  • 1) 闻起来像 Qt 中的错误。你考虑过reporting it吗? 2) 我自己不是 Windows 专业用户:您确定现在 100% 支持提供前缀路径 / 来运行 make install 吗?
  • 网站上写的可以使用prefix和nmake install doc.qt.io/qt-5/windows-building.html 添加imm32.lib winmm.lib Ws2_32.lib 不能解决问题。
  • 更新:更准确地说,添加 Ws2_32.lib 实际上解决了 103 错误之一。 (qeventdispatcher_win.obj 中的“_WSAAsyncSelect@16”)当我添加这三个库时,其他 102 个仍然存在。更新 2:现在还有一个bug report

标签: c++ visual-studio qt linker static-linking


【解决方案1】:

我找到了解决办法:

您必须将以下库添加到 Visual Studio 中的其他依赖项:

Ws2_32.lib opengl32.lib qtharfbuzzng.lib

然后,我的项目终于编译好了。

然而,这并不是故事的结局:

虽然编译成功,但我的应用程序在启动时显示以下错误消息:

此应用程序无法启动,因为它无法找到或加载 Qt 平台插件“windows”。

要解决这个问题,您必须向其他依赖项添加更多库:

imm32.lib winmm.lib Qt5PlatformSupport.lib qwindows.lib

...以及您的附加库目录中的以下内容:

$(QTDIR)\plugins\platforms

...以及您的源代码中的以下内容:

#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)

完成!最后,我能够链接到静态 Qt 库。

这是值得的:

我的应用程序的冷启动时间从大约 10 秒大幅缩短到不到 1 秒。而不是 14 MB 的 DLL 文件,我只需要部署一个 8 MB 的 EXE 文件。

【讨论】:

  • 很棒的教程,谢谢。我只补充一点,在创建静态库时,必须在 ${QtDir}\mkspecs\win32-msvc2013\qmake.conf 中进行更改。详情here.
  • @mr.pohl:是的,如果您想链接静态 Visual Studio 运行时库,您必须进行这些更改。但这不是强制性的,因为您可以要求最终用户安装适当的 Visual C++ Redistributable Package。 (see here)。此外,必须提到 Qt 建议不要链接到静态 Visual Studio 运行时。 (see here)
  • 谢谢,但是在哪里可以找到这些依赖项?
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2020-04-30
相关资源
最近更新 更多