- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
好吧,我花了一天时间寻找解决方案并阅读了所有内容,但我无法部署我的 Qt 应用程序,所以我决定问问。
我在 VS 2013 Ultimate 中通过 Visual Studio 插件使用 Qt 5.2.1,qt 版本是 msvcr2012。我有 Qt 5.2 的 x86 版本(现在是 Qt 下载页面底部的第三个)。
我的目标是 Win7 32 位。
我的操作系统是 Windows7 64 位,我正在为 win32
构建应用程序,release
/o2(最大速度)
优化, /MD(动态 C 运行时)
,链接库:
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
我已经设置了额外的库路径(只是为了 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();
};
路径是正确的。通过调试器,我看到它们是从我的应用程序文件夹中加载的,而不是从 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。
所有这些都在我的(开发者)电脑上运行,没有任何错误,但在测试(在 Microsoft Virtual PC 上运行的 Win7 32 位)电脑上我得到了“臭名昭著”的错误:
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,控制台仅将发布文件夹输出为库输入(而不是像我的第一个测试那样的 Qt 文件夹)。它从应用程序文件夹加载 dll-s,启动良好。然而,在我的虚拟 PC 上,或者在我兄弟的 pac(Win7 32 位)上,它给了我错误。关于这个的图片:
如何在32位机器上运行?我在每个构建、release-win32、debug-win32 中都尝试过,但都不起作用。我无法在更多机器上测试它,在 XP 上它甚至无法加载 C 运行时,但这不是目标平台。
更多信息请评论。
编辑:目标电脑上的 Dependency walker 显示与开发电脑上的相同。它仍然可以找到插件,但无法加载。
最佳答案
我不知道你为什么要设置路径等等。你链接的 Qt wiki 文章显示你没有 plugins
文件夹,但该文件夹中的所有内容都应该去到您的可执行文件的文件夹中。
他们给出的建议很简单:
Qt 的 bin
目录中的每个 .dll
都需要复制到您的可执行文件的文件夹中。
Qt 的 plugins
和 qml
文件夹中的所有内容(文件和文件夹)都需要复制到您的可执行文件的文件夹中。
然后您可以将其缩减为不使用的模块。对我有用,很好。
说“我必须将 .dll-s 添加到发布版本中,因为我没有使用商业版本”也是不正确的。如果你follow my advice ,您可以使用 Qt 5 和 MSVC 2012 轻松构建静态链接的可执行文件,我什至详细介绍了如何使用所有这些来定位 Windows XP。根据 LGPL 条款,您可以做得很好,您只需要让您的用户重新链接您的项目(这并不意味着提供 C++ 源代码!)。
关于windows - 在 win7 32 位上部署 Qt 应用程序 - 在 Win7 x64 上工作(和编译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490869/
我是一名优秀的程序员,十分优秀!