【发布时间】:2009-06-26 18:23:57
【问题描述】:
我有一个 Windows 屏幕保护程序,我想使用 QT 库重新编译它,以便可以用于更多平台。 我在 Vista 和 XP 上的部署遇到了问题。
我用 MT 静态编译我的屏幕保护程序,然后运行依赖项检查器。 结果是:
MyScreensaver.SCR 需要几个 DLL,QTCORE4.DLL 但不需要 MSVCx80.DLL。 到目前为止,这很好。
我的问题是 QTCORE4.DLL 确实需要 MSVCP80.DLL 和 MSVCR80.DLL 因此,我的应用程序无法在 Vista 系统上运行。
我可以构建 QTCORE4.DLL 以静态链接微软库(可能是 Libcmt.lib 吗?),以便我在 MS CRT DLL 中没有任何依赖关系?
限制:
我不想让用户安装 MS VC 可再发行组件。屏保只有1MB,为了屏保要求用户在电脑上做这么多改动是可笑的。
-
我不想使用这个技巧将 MS CRT dll 与屏幕保护程序放在同一应用程序路径中,因为屏幕保护程序安装在 system32 中,我想在那里安装尽可能少的文件。
最后,我更喜欢生成一个单体程序,而不是一堆 DLL
-
我尝试了 QT 的完整静态编译和链接,但这是不允许的(如果我理解正确,LGPL),也不建议根据此:http://www.qtsoftware.com/developer/faqs/why-does-a-statically-built-qt-use-the-dynamic-visual-studio-runtime-libraries-do-i-need-to-deploy-those-with-my-application
在尝试了各个方向的解决方案之后,似乎最可行的方法是使用 QTCore4.dll 和 QTGui4.dll,但将它们静态链接到 MSVCRT。这样,我的程序和 QT DLL 都不会依赖 MSVCRT dll。
有解决办法吗? (我是 QT 编程新手)
谢谢你, 迈克尔
【问题讨论】:
-
更新:我已经静态地构建了 QT,我已经在链接器中包含了 QTcore.lib 并使用 /MT 静态地构建了我的应用程序。我现在看到屏幕保护程序依赖于 MSVCR80.DLL,很可能是因为 QT (QTcore.lib) 的静态构建也依赖于它。 MSVCR80.DLL 对我来说是一个障碍,因为正如我上面所说,我无法在 XP 和 vista 上部署。所以,现在的问题是:有没有办法构建一个不依赖 MSVCR80.DLL 的 QT 应用程序?感谢您的帮助迈克尔
标签: qt deployment msvcrt