使用外部 *.lib 文件进行 Qt 部署

Qt deployment with external *.lib files

我需要帮助来部署带有附加库 (*.lib) 的 qt 应用程序。 我的项目是在 VS2010 + Qt5 中开发的,并在 LIB 目录中使用了一些第 3 方库(在其他 LIBrary 目录中使用 VS 项目设置指定)。 我搜索了正确的部署方式并找到了以下解决方案:

  1. 使用windeployqt.exe将所有必要的qt dll复制到部署中 目录。
  2. 确保用户已经安装了可再发行的 C++ 他的平台包。
  3. 复制所有资源和依赖项 进入调试配置中的结构。
  4. 添加库路径 在应用中:

QStringList 路径 = QCoreApplication::libraryPaths();//\n

    paths.append(".");
    paths.append("imageformats");
    paths.append("platforms");
    paths.append("sqldrivers");
    paths.append("LIB");   // all *.lib `s there
    QApplication::setLibraryPaths(paths);

完成这些步骤后,我的应用程序成功启动,但是当我开始使用外部库中的代码时,程序崩溃了! (从 *libs) Im 激活函数,试图在我能想象的每个地方复制这个第 3 方库 - 根文件夹,LIB 文件夹(附加在 VS 属性中),从应用程序文件夹的更高级别 - 运气不好。也我使用了外部 dll - 它放置在应用程序可执行文件旁边 file.But 似乎可以正常工作。 在调试器中我有下一个错误: 在 ntdll.dll

崩溃
CAtlString str = currentFolder->whatsThis().toStdWString().c_str();
//  std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Tidy(bool _Built, unsigned __int64 _Newsize)  Line 1998 C++
//  std::allocator<wchar_t>::deallocate(wchar_t * _Ptr, unsigned __int64 __formal)  Line 183    C++

我需要什么才能让我的应用程序像 VS2010 中的调试模式一样开始工作?我如何 "activate" 在部署的项目中添加额外的库?

更新: 抱歉,问题不在 Libs 中。我惊讶地发现 VS 中的程序在 没有 库的情况下工作。我只使用 DLL 中的函数,没有额外的依赖项。 所有错误都来自 CRT (ntdll.dll) - 就像上面的字符串操作一样。正如我所想,这意味着我部署了错误版本的 MSVCRT100D.dll。我不知道,它必须与调试 dll 一起使用还是我只需要使用 MSVCRT100.dll(不调试)? 我还更改了项目版本以在程序启动时发布并捕获以下错误:

在调试配置中它工作正常。但在发布中 - 函数 __tmainCRTStartup()/WinMain().

中的矢量迭代器错误

我该怎么做才能避免这些问题?

更新 2: 我忘记重建 dll 以发布,但现在 msvcrt100.dll 中的释放 ~basic_string() 问题仍然存在。 VS 中的 运行 程序和双击 运行 有什么区别?(dll 使用 msvcp100.dll 和 msvcrt100.dll 静态构建)。从 VS 执行程序成功。没有字符串 dealloc 问题)

问题出在不同的 Qt 和程序库运行时。 basic_string 中的析构函数调用不同的运行时,程序已崩溃。 这是决定: