Qt 5.4 静态构建在 Visual Studio 2013 中产生"unresolved external symbol"链接错误

Qt 5.4 static build produces "unresolved external symbol" link error in Visual Studio 2013

本文关键字:unresolved external 错误 链接 symbol 2013 静态 构建 Studio Visual Qt      更新时间:2023-10-16

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

我的环境如下:

  • 视窗 7 x64
  • Visual Studio 2013 Ultimate Update 4
  • Qt5 Visual Studio Add-in 1.2.4
  • 已安装ActivePerl/ActivePython(构建Qt源代码需要)

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

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

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

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

然后在Visual Studio中,我将现有Qt项目的Qt版本更改为D:Qtqt-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)正如评论中已经提到的,这可能是Qt中的一个错误,所以我创建了一个错误报告(QTBUG-43636),后来我发现了一个可能相关的错误(QTBUG-38913)。(对不起,我不能发布不超过2个链接)

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

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

这意味着现在"只"剩下 55 条错误消息。也许还有更多的图书馆缺失?

我找到了解决方案:

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

Ws2_32.lib opengl32.lib qtharfbuzzng.lib

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

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

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

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

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

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

。以及其他库目录的以下内容:

$(QTDIR)pluginsplatforms

。以及源代码的以下内容:

#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)

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

值得付出努力:

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