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

时间:2016-06-27 12:01:41

标签: c++ qt visual-studio-2010 deployment

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

  1. 使用windeployqt.exe将所有必需的qt dll复制到deploy中 目录。
  2. 确保用户已安装可再发行的C ++     为他的平台打包。
  3. 复制所有资源和依赖项         像调试配置一样进入结构。
  4. 添加libs的路径     在应用程序中:
  5. QStringList paths = QCoreApplication :: libraryPaths(); // \ n

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

    完成此步骤后,我的应用程序成功启动,但是当我开始使用外部库中的代码时,程序崩溃了! (激活来自* lib s) I的函数试图在我可以想象的每个地方复制这个第三方库 - 根文件夹,LIB文件夹(附加在VS属性中),在应用程序文件夹的更高级别 - 没有幸运。我使用外部DLL - 它放在app可执行文件的旁边。但它似乎有效。 在调试器中我有下一个错误: 在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中以调试模式开始工作需要什么?我怎样才能激活&#34;部署项目中的其他库?

    更新:对不起,伙伴们,但问题不在Libs。我惊讶地发现VS中的程序没有 libs。我只使用DLL中的函数,没有额外的依赖。 所有错误都来自CRT(ntdll.dll) - 就像上面的字符串操作一样。我认为,这意味着我已经部署了错误版本的MSVCRT100D.dll。我不知道,它是否适用于调试DLL或我只需要使用MSVCRT100.dll(不调试)? 此外,我已将项目版本更改为发布,并在程序启动时捕获以下错误:enter image description here

    在调试配置中,它可以正常工作。但是在发布中 - 函数__tmainCRTStartup()/ WinMain()中的向量迭代器错误。

    enter image description here

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

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

1 个答案:

答案 0 :(得分:0)

问题在于不同的Qt和程序库运行时。 basic_string中的析构函数调用不同的运行时和程序已经崩溃。 这是决定:crash on std::string destructor