好吧,我花了一天时间寻找解决方案并阅读了所有内容,但我无法部署我的Qt应用程序,因此我决定提问。
我在VS 2013 Ultimate中通过Visual Studio加载项使用Qt 5.2.1,qt版本是msvcr2012。我有Qt 5.2的x86版本(现在是Qt下载页面底部的第3版)。
我的目标是Win7 32位。
我的操作系统是Windows7 64位,我正在为win32
,release
/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。
.../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)上,它给了我错误。关于此的图片:
如何在32位机器上运行它?我尝试了每个构建版本,release-win32,debug-win32,它们都不起作用。我无法在更多机器上测试它,在XP上它甚至无法加载C运行时,但这不是目标平台。
如需了解更多信息,请发表评论。
编辑:目标pc上的依赖性walker与dev pc上的相同。它仍然可以找到插件,但无法加载。
答案 0 :(得分:2)
我不知道为什么你要设置路径等等。你链接的Qt wiki文章显示你没有plugins
文件夹,但该文件夹中的所有内容都应该进入你的可执行文件夹。
他们给出的建议非常简单:
Qt的.dll
目录中的每个bin
都需要复制到您的可执行文件夹中。
Qt的plugins
和qml
文件夹中的所有内容(文件和文件夹)都需要复制到您的可执行文件夹中。
然后,您可以将其剪切为您不使用的模块。对我有用,就好了。
说&#34;我必须将.dll-s添加到发布版本中也是不正确的,因为我没有使用商业版本。&#34;。如果您follow my advice,您可以使用Qt 5和MSVC 2012轻松构建静态链接的可执行文件,我甚至会提供有关如何使用所有这些来定位Windows XP的详细信息。你可以在LGPL的条款下做得很好,你只需要让你的用户重新链接你的项目(这并不意味着给出C ++源代码!)。
答案 1 :(得分:0)
问题不在于插件,而是还要求VS2010 redists 在我尝试了所有我在Qt文件夹中找到它之后,尝试运行我的应用程序并安装它。现在它也在Virtual PC上运行,但是,它没有在依赖项中列出(或者我监督它)。它仅列出了2012年和2013年的版本。