在win7 32位上部署Qt应用程序 - 在Win7 x64上运行(和编译)

时间:2014-03-18 20:56:56

标签: windows qt visual-c++ visual-studio-2012 deployment

好吧,我花了一天时间寻找解决方案并阅读了所有内容,但我无法部署我的Qt应用程序,因此我决定提问。

我在VS 2013 Ultimate中通过Visual Studio加载项使用Qt 5.2.1,qt版本是msvcr2012。我有Qt 5.2的x86版本(现在是Qt下载页面底部的第3版)。

我的目标是Win7 32位。

我的操作系统是Windows7 64位,我正在为win32release /o2 (max speed)优化/MD (dynamic C runtime)构建应用程序,并且链接了库:

qtmain.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
Qt5PlatformSupport.lib //this one is added by me, the others are automatically set with the Qt-AddIn template.

我构建它,并且在发布文件夹中我提出了以下内容:

编辑:由于我的编译器版本,我也按你所见的方式分发了vs2012 dll.s。

enter image description here

.../release                                            /plugins        /platforms

我已经设置了addittional库路径(只是为了100%找到它们的机会):

void registerPluginsDir(QDir& exeDir)
{
QString pluginsRelPath = "plugins";
QString platformsRelPath = "platforms";
QString pluginsPath = exeDir.absoluteFilePath(pluginsRelPath);
QString platformsPath = QDir(pluginsPath).absoluteFilePath(platformsRelPath);
QStringList pathes = QCoreApplication::libraryPaths();
pathes << pluginsPath;
pathes << platformsPath;
QCoreApplication::setLibraryPaths(pathes);

for (auto i : pathes)
    qDebug() << i << "\n";
};

int main(int argc, char *argv[])
{
    QString exePath = QString::fromUtf8(argv[0]);
    QFileInfo exeInfo(exePath);
    QDir exeDir(exeInfo.absolutePath());
    registerPluginsDir(exeDir);

    QApplication a(argc, argv);
    KeyGenerator w;
    w.show();
    return a.exec();
};

路径是正确的。使用调试器,我看到它们是从我的app文件夹加载的,而不是从Qt主文件夹加载的。

使用depends.exe我检查了一切。我只收到2个警告,没有错误:

Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

我根据在Visual Studio中调试应用程序时加载的.dll-s复制了.dll-s。 depends.exe和debug之间的唯一区别,VS系统dll-s中的唯一区别是从SysWOW64而不是system32加载。

所有这些在我的(开发人员)电脑上运行时没有任何错误,但在测试(Win7 32位在Microsoft Virtual PC上运行)pc上我得到'臭名昭着'的错误:

Failed to load platform plugin “windows”. Available platforms are:
(and here there are the full pathes to the .dll-s, 
eg: D:\cproj\keygen\win32\Release\plugins\platforms\qwindows.dll, so it must have found them.

我也遵循了这一点:http://qt-project.org/wiki/Deploy_an_Application_on_Windows
重命名为Qt-dir,控制台只输出release文件夹作为库输入(不像我的第一次测试那样输入Qt文件夹)。它从app文件夹中加载了dll-s,启动良好。但是,在我的虚拟PC或我兄弟的pac(Win7 32bit)上,它给了我错误。关于此的图片:

enter image description here

如何在32位机器上运行它?我尝试了每个构建版本,release-win32,debug-win32,它们都不起作用。我无法在更多机器上测试它,在XP上它甚至无法加载C运行时,但这不是目标平台。

如需了解更多信息,请发表评论。

编辑:目标pc上的依赖性walker与dev pc上的相同。它仍然可以找到插件,但无法加载。

2 个答案:

答案 0 :(得分:2)

我不知道为什么你要设置路径等等。你链接的Qt wiki文章显示你没有plugins文件夹,但该文件夹中的所有内容都应该进入你的可执行文件夹。

deployment screenshot

他们给出的建议非常简单:

  1. Qt的.dll目录中的每个bin都需要复制到您的可执行文件夹中。

  2. Qt的pluginsqml文件夹中的所有内容(文件和文件夹)都需要复制到您的可执行文件夹中。

  3. 然后,您可以将其剪切为您不使用的模块。对我有用,就好了。

    说&#34;我必须将.dll-s添加到发布版本中也是不正确的,因为我没有使用商业版本。&#34;。如果您follow my advice,您可以使用Qt 5和MSVC 2012轻松构建静态链接的可执行文件,我甚至会提供有关如何使用所有这些来定位Windows XP的详细信息。你可以在LGPL的条款下做得很好,你只需要让你的用户重新链接你的项目(这并不意味着给出C ++源代码!)。

答案 1 :(得分:0)

问题不在于插件,而是还要求VS2010 redists 在我尝试了所有我在Qt文件夹中找到它之后,尝试运行我的应用程序并安装它。现在它也在Virtual PC上运行,但是,它没有在依赖项中列出(或者我监督它)。它仅列出了2012年和2013年的版本。