【问题标题】:Building A static version of Qt 5.2.1 with Visual Studio 2013使用 Visual Studio 2013 构建 Qt 5.2.1 的静态版本
【发布时间】:2014-03-12 15:03:36
【问题描述】:

几天来,我一直在尝试使用 Visual Studio 2013 构建 Qt 的静态版本。 我就是想不通我做错了什么。

系统:

  • Windows 7 64 位
  • Visual Studio 2013(仍安装 Visual Studio 2012)
  • Perl 已安装 (ActivePerl-5.18.2.1801-MSWin32-x64-297964.msi)
  • Python 已安装 (python-2.7.6.amd64.msi)
  • Direct X 10 SDK 已安装(DXSDK_Jun10.exe 我不得不使用这个workaround
  • 已下载Qt 5.2.1
  • 已下载Qt 5.3.0 alpha

我多次做了什么:

  • 在临时文件夹 (C:\QtSrc) 中提取源代码
  • 删除 qtwebkit 和 qtwebkit-examples 目录

对于每个文件夹,我启动了一个 Visual Studio x86 命令行并运行:

  • cd C:\QtSrc
  • 配置 -c++11 -mp -debug-and-release -static -angle -nomake 测试 -nomake 示例 -prefix C:\Qt\5.2.1\msvc2013 -platform win32-msvc2013
  • nmake
  • nmake 安装

对于我尝试过的 -static 与 -shared 或 Qt 5.2.1 与 Qt 5.3.0 alpha 的每种变体,这总是成功的。

在 Qt Creator 中

我可以使用共享的 Qt 库注册各种工具包、编译和启动任何示例。另一方面,使用静态 Qt 库的示例从未编译过。 错误总是如下所示:LNK1104: cannot open file 'C:/Qt/5.3.0/msvc2013-static/lib/translator_common.lib'。 问题是文件丢失(调试模式下的translator_commond.lib或发布模式下的translator_common.lib)

在 Visual Studio 2013 中(使用 Visual Studio Addin 1.2.3 alpha)

我可以添加 Qt 版本并更改我的解决方案的 Qt 版本。 如果可以使用共享版本的 Qt 编译和运行像这样一个非常简单的程序:

#include <QtCore>
#include <QtGui>
#include <QtWidgets>

Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);

int main(int argc,char*argv[]){
    QApplication app(argc,argv);
    QMessageBox::critical(nullptr,"Hello","Hello Qt!");
    return 0;}

使用静态版 Qt 时出现未解决的外部链接器错误:

1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShInitialize referenced in function "private: void __thiscall gl::Shader::initializeCompiler(void)" (?initializeCompiler@Shader@gl@@AAEXXZ)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShFinalize referenced in function "public: static void __cdecl gl::Shader::releaseCompiler(void)" (?releaseCompiler@Shader@gl@@SAXXZ)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShInitBuiltInResources referenced in function "private: void __thiscall gl::Shader::initializeCompiler(void)" (?initializeCompiler@Shader@gl@@AAEXXZ)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShConstructCompiler referenced in function "private: void __thiscall gl::Shader::initializeCompiler(void)" (?initializeCompiler@Shader@gl@@AAEXXZ)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShDestruct referenced in function "public: static void __cdecl gl::Shader::releaseCompiler(void)" (?releaseCompiler@Shader@gl@@SAXXZ)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShCompile referenced in function "protected: void __thiscall gl::Shader::compileToHLSL(void *)" (?compileToHLSL@Shader@gl@@IAEXPAX@Z)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShGetInfo referenced in function "protected: void __thiscall gl::Shader::compileToHLSL(void *)" (?compileToHLSL@Shader@gl@@IAEXPAX@Z)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShGetInfoLog referenced in function "protected: void __thiscall gl::Shader::compileToHLSL(void *)" (?compileToHLSL@Shader@gl@@IAEXPAX@Z)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShGetObjectCode referenced in function "protected: void __thiscall gl::Shader::compileToHLSL(void *)" (?compileToHLSL@Shader@gl@@IAEXPAX@Z)
1>libGLESv2d.lib(Shader.obj) : error LNK2019: unresolved external symbol _ShGetInfoPointer referenced in function "protected: void __thiscall gl::Shader::compileToHLSL(void *)" (?compileToHLSL@Shader@gl@@IAEXPAX@Z)

尽管我付出了所有努力,但我还是找不到要包含哪个库来解决那些丢失的符号。

你知道我做错了什么吗?

【问题讨论】:

  • 由于这是一个以英语为主的网站,我建议翻译错误消息。话虽如此,我相信错误是说它无法解析函数 __thiscall 中的外部引用,对吗?
  • 我翻译了错误信息。您对 Visual Studio 非常正确,我需要链接到某个库,但我找不到哪个库。
  • 我对此了解不多,但看起来它缺少 OpenGL 实现。也许尝试与这样的东西联系? code.google.com/p/angleproject
  • @DarkFalcon 感谢您的帮助!但这就是配置中 -angle 选项的用途。但是,您提供的链接指出需要 Directx11(这是我计算机上安装的版本),但我只有 Direct x10 的 SDK。我将在 Windows 8 上尝试 Directx10 的安装不会强制卸载某些组件。

标签: c++ visual-studio qt static-libraries qt5


【解决方案1】:

在使用 -angle 和 -static 时,make install 存在错误

您可以找到错误报告here

一个简单的解决方法是在构建过程结束时添加一些副本:

copy qtbase\lib\translator_common.lib C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\translator_common.prl C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\translator_commond.lib C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\translator_commond.prl C:\Qt\5.3.0\msvc2013-static\lib\

copy qtbase\lib\translator_hlsl.lib C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\translator_hlsl.prl C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\translator_hlsld.lib C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\translator_hlsld.prl C:\Qt\5.3.0\msvc2013-static\lib\

copy qtbase\lib\preprocessor.lib C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\preprocessor.prl C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\preprocessord.lib C:\Qt\5.3.0\msvc2013-static\lib\
copy qtbase\lib\preprocessord.prl C:\Qt\5.3.0\msvc2013-static\lib\

我希望这可以帮助其他人。

【讨论】:

  • Qt 5.2.1 和 Visual Studio 2013 对您有用吗?鉴于 Qt 需要一段时间来提供官方支持,我仍然有点紧张。谢谢!
  • @moodboom 我对 Qt 还是很陌生,但使用 Visual Studio 2013 和 Qt 5.3 alpha 似乎一切正常。如果你想再等一等,Qt 5.3 正式版即将发布soon。它将支持 Visual Studio 2013。如果您想要 Qt 库的静态版本,则无论如何您都需要自己编译它们。它们不会被包括在内。
【解决方案2】:

我碰巧遇到了同样的问题。我认为您要链接的lib 文件是translator_commond.lib。它包含天使符号。

这是我找到库名称的方法,以防在您遇到其他未解决的 Qt 外部符号时会有所帮助。

dumpbin.exe 工具在这里非常有用。您可以执行dumpbin.exe /symbols some_lib.lib | findstr /c:"SOME_SYMBOL" 来查看库是否包含或使用符号。

由于Qt中有这么多的库,我只是在Qt目录中搜索所有*.lib文件并将它们复制到一个目录中,然后使用下面的命令进行批量搜索。

for %f in (*.lib) do echo %f >> symbols.txt && dumpbin /symbols %f | findstr /c:"SOME_SYMBOL" >> symbols.txt

完成后,您可以检查生成的symbols.txt 并找出包含您要查找的符号的库的名称。

顺便说一句,因为有几个巨大的库,例如Qt5Core、Qt5Quick 等,您可能希望将它们排除在搜索之外。

【讨论】:

  • 这是答案的一半。问题是文件丢失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2015-04-24
相关资源
最近更新 更多