Qt 5.4.0 部署问题 - msvcrt.dll 中缺少 vsprintf_s
Qt 5.4.0 deployment issue - missing vsprintf_s in msvcrt.dll
我的 Qt 5.4.0 应用程序遇到部署问题。
经过两天的研究,我的应用程序真的不想在 Windows XP 上执行!
我已经使用 Qt 安装提供的 windeployqt 创建了我的部署文件夹。当我双击 *.exe 时,我总是:
The procedure entry point vsprintf_s could not be located in the dynamic link library msvcrt.dll.
Dependency walker 并没有真正帮助我,我不知道我现在可以尝试什么。
注意:
- SDK:Qt 5.4.0(MSVC 2010,32 位)
- IDE : QT Creator 3.3.0
- 编译器:MinGW 4.9.1 32 位
- 需要 运行 : Windows XP Pro SP2 32 位
- 在具有相同配置(IDE、编译器等)的 Windows 7 上,应用程序运行得非常好
错误是我在代码中的某处调用了 "sprintf_s"(在我的开发机器上最近的 windows 可以,但 XP 不行)。
如果您在搜索代码时遇到同样的问题,请不要使用错误消息中的函数名称,而是使用 *_s 之类的表达式。
您可能在某处调用了安全 API 函数 !
虽然 Guilhem G. 在广义上是正确的,但这并不意味着您实际上自己调用了该函数(现在与理论上像我一样关注此问题的其他人 运行 交谈,呵呵)。我相信这是 MinGW 的 XP 支持的一个错误;我已经看到 similar 问题的错误报告,包括在后来修复的更早版本的 Qt 中几乎完全相同的问题。我还没有看到这个特殊的化身,我实际上 运行 进入了自己。我想我应该提交错误报告!
无论如何,我已经修复了它而没有更改我自己编写的任何代码。我必须做的修复是双重的:
- 切换到使用 msvc2010 编译器,因为这组 C++ 库在 Windows XP 上 运行 相当正常(据我所知,他们仍然没有放弃对最新版本的 XP 支持) .
- 切换到 Qt 5.5(我会在最后解释原因)。
对于编译器,您将需要 Microsoft Visual Studio 2010(因此得名),或随附的较旧的 Windows SDK;如果您没有 Visual Studio 2010 许可证,"Microsoft Windows Software Development Kit for Windows Server 2008 and .NET Framework 3.5" 版本应该可以解决问题。
安装其中一个后,我建议您安装由 MSVC2010 编译的 Qt 5.5。您可以启动全新安装程序或使用应该已经安装的 Qt 维护工具。
安装该套件后,在您的项目中(selecting "Projects" 从左侧菜单)您应该可以进入 "Add Kit" 和 select Qt 5.5 msvc2010 32 位,如果您现在重新编译并重新部署您的应用程序,它应该 运行 在 XP 上正常。
现在,为什么我坚持要你升级到 Qt 5.5?好吧,在 Windows 的每个版本上选择可用的 OpenGL 渲染器都存在一些潜在的问题,而 Qt 5.5 通过根据实际检测到的功能返回到 OpenGL 或 ANGLE 以及 IIRC 一些其他功能来简化这一点相关修复。因此,如果您像我一样在多个 Windows 版本中部署 QML / Qt Quick 2.0 应用程序,那么升级到 Qt 5.5 是值得的。
我的 Qt 5.4.0 应用程序遇到部署问题。 经过两天的研究,我的应用程序真的不想在 Windows XP 上执行!
我已经使用 Qt 安装提供的 windeployqt 创建了我的部署文件夹。当我双击 *.exe 时,我总是:
The procedure entry point vsprintf_s could not be located in the dynamic link library msvcrt.dll.
Dependency walker 并没有真正帮助我,我不知道我现在可以尝试什么。
注意:
- SDK:Qt 5.4.0(MSVC 2010,32 位)
- IDE : QT Creator 3.3.0
- 编译器:MinGW 4.9.1 32 位
- 需要 运行 : Windows XP Pro SP2 32 位
- 在具有相同配置(IDE、编译器等)的 Windows 7 上,应用程序运行得非常好
错误是我在代码中的某处调用了 "sprintf_s"(在我的开发机器上最近的 windows 可以,但 XP 不行)。 如果您在搜索代码时遇到同样的问题,请不要使用错误消息中的函数名称,而是使用 *_s 之类的表达式。 您可能在某处调用了安全 API 函数 !
虽然 Guilhem G. 在广义上是正确的,但这并不意味着您实际上自己调用了该函数(现在与理论上像我一样关注此问题的其他人 运行 交谈,呵呵)。我相信这是 MinGW 的 XP 支持的一个错误;我已经看到 similar 问题的错误报告,包括在后来修复的更早版本的 Qt 中几乎完全相同的问题。我还没有看到这个特殊的化身,我实际上 运行 进入了自己。我想我应该提交错误报告!
无论如何,我已经修复了它而没有更改我自己编写的任何代码。我必须做的修复是双重的:
- 切换到使用 msvc2010 编译器,因为这组 C++ 库在 Windows XP 上 运行 相当正常(据我所知,他们仍然没有放弃对最新版本的 XP 支持) .
- 切换到 Qt 5.5(我会在最后解释原因)。
对于编译器,您将需要 Microsoft Visual Studio 2010(因此得名),或随附的较旧的 Windows SDK;如果您没有 Visual Studio 2010 许可证,"Microsoft Windows Software Development Kit for Windows Server 2008 and .NET Framework 3.5" 版本应该可以解决问题。
安装其中一个后,我建议您安装由 MSVC2010 编译的 Qt 5.5。您可以启动全新安装程序或使用应该已经安装的 Qt 维护工具。
安装该套件后,在您的项目中(selecting "Projects" 从左侧菜单)您应该可以进入 "Add Kit" 和 select Qt 5.5 msvc2010 32 位,如果您现在重新编译并重新部署您的应用程序,它应该 运行 在 XP 上正常。
现在,为什么我坚持要你升级到 Qt 5.5?好吧,在 Windows 的每个版本上选择可用的 OpenGL 渲染器都存在一些潜在的问题,而 Qt 5.5 通过根据实际检测到的功能返回到 OpenGL 或 ANGLE 以及 IIRC 一些其他功能来简化这一点相关修复。因此,如果您像我一样在多个 Windows 版本中部署 QML / Qt Quick 2.0 应用程序,那么升级到 Qt 5.5 是值得的。