Qt 5.4静态构建在Visual Studio 2013中产生"未解析的外部符号"链接错误

man*_*uel 5 c++ linker qt static-linking visual-studio

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

我的环境如下:

  • Windows 7 x64
  • Visual Studio 2013 Ultimate Update 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
  • 提取到临时文件夹
  • 打开的如上所述的命令提示这里(基本上,这类似于打开"Visual Studio命令提示符"和加入一些路径的路径变量)
  • 使用以下命令运行configure

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • 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)
Run Code Online (Sandbox Code Playgroud)

具有类似选项(-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条错误消息.也许还有更多的图书馆遗失?

man*_*uel 11

我找到了解决方案:

您必须将以下库添加到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)
Run Code Online (Sandbox Code Playgroud)

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

值得付出的努力:

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