man*_*uel 5 c++ linker qt static-linking visual-studio
我想使用Qt 5.4的静态版本.由于没有可用的预编译静态构建,您必须自己从Qt源代码构建一个.
我的环境如下:
我的程序如下(参见Qt文档> Qt 5.4> Qt for Windows - 从源代码构建):
使用以下命令运行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)跑nmake和nmake 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文件.