我有一个Windows屏幕保护程序,我想使用QT库重新编译,以便我可以提供更多平台。 我在Vista和XP上部署时遇到了问题。
我使用MT静态编译我的屏幕保护程序,并运行依赖项检查程序。 结果是:
MyScreensaver.SCR需要多个DLLS,QTCORE4.DLL但不需要MSVCx80.DLL。 到目前为止,这很好。
我的问题是QTCORE4.DLL反过来,确实需要MSVCP80.DLL和MSVCR80.DLL 因此,我的应用程序无法在Vista系统上运行。
我可以构建QTCORE4.DLL以静态链接微软库(可能是Libcmt.lib吗?),这样我在MS CRT DLL中没有任何依赖项?
限制:
我不希望用户安装MS VC可再发行组件。屏幕保护程序只有1 MB,要求用户在屏幕保护程序中对计算机进行如此多的更改是荒谬的。
我不想使用这个技巧将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编程的新手)
谢谢你, 迈克尔
答案 0 :(得分:1)
我认为他们是一致的,您的应用程序的部分将使用/ MD(d)和/ MT(d)部分进行编译,但如果您控制所有内容(包括第三方库),则使用/ MT非常安全(d)。
答案 1 :(得分:1)
您有两种选择:
这些依赖项属于Microsoft Visual C++ Runtime库的一部分,您可以在安装屏幕中部署该库,用户可以静默安装它,默认情况下,Windows中不包含MSVCRT库,必须在installshield中部署运行时库,并在应用程序目录中复制Qt*.dll
DLL。
使用Static Linking
Runtime和Qt主要依赖项,使用此选项可以获得一个可执行文件,但是对于Qt的静态编译,您必须拥有Qt商业许可证才能用于商业用途。