Visual Studio C++dll库在Qt应用程序中崩溃

Visual Studio C++ dll library crashes in Qt application

本文关键字:应用程序 崩溃 Qt 库在 Studio C++dll Visual      更新时间:2023-10-16

我在MS Visual C++DLL库和Qt程序之间共享"std::string"数据时遇到问题。

我拥有的是:

  • 用Visual C++2010学习版编写的DLL库,它导出一种方法:

    extern "C" __declspec(dllexport) int Init(ITest* commandTest);
    
  • 抽象接口"ITest"和实现它的类:

    class CTest: public ITest
    {
    public:
    CTest();
    virtual ~CTest();
    virtual void getVersion(std::string & version) const;
    };
    
  • Qt GUI应用程序需要:

    * load the DLL dynamically
    * instantiate CTest and pass it to exported Init method.
    

在DLL的"Init"中,会调用"CTest::getVersion()"方法。我希望它能填充"&version"字符串。当我用新字符串填充"&aamp;version"时,我得到的却是行上的崩溃。

我已经做了什么:

  • 从下载了"适用于Windows的Qt库4.8.3(VS 2010,235 MB)"http://qt-project.org/downloads,安装了它,并在QtCreator的项目设置中选择了它。

  • 在QtCreator中,从MinGW工具链切换到与MS Visual Studio 2010学习版一起安装的工具链。

    我认为它会克服这个问题,因为我使用了用VS 2010编译的Qt库,而Qt GUI当时也是用VS C++工具链编译的。不幸的是,问题没有消失,所以我尝试了最后一步:

  • 在Visual Studio中创建了Win32控制台应用程序,通过LoadLibrary加载了我的DLL,使用了与Qt GUI中相同的"Init"方法。。。它成功了!!

小观察

在"CTest::getVersion()"中,我打印通过引用传递给控制台的这个"版本"字符串。当使用VS C++控制台应用程序作为主机时,它会正确打印出来。当使用Qt应用程序时,"版本"字符串会打印出一些垃圾(例如。┌►☻qwerty27)

这让我认为Qt应用程序的ABI和我的DLL仍然不兼容,即使在使用上面提到的Qt VS 2010库时也是如此。

问题:

  • 使用适用于Windows(VS 2010)和Visual Studio工具链的Qt库是否不足以解决ABI兼容性问题
  • 这是否意味着我应该自己编译Qt框架
  • 请帮忙-欢迎有任何想法

在一个项目中,我遇到了与您非常相似的情况,两个DLL,同一个编译器(VC++2010)。我把std::string从一个传给另一个,结果发生了很多崩溃。

问题是一个DLL是用多线程调试DLL(/MDd)编译的,另一个是用多线程调试器(/MTd)译的。这导致了两个DLL之间的二进制不兼容(崩溃)。此外,版本必须匹配,对两个DLL都使用DEBUG或RELEASE。

查看您的项目,这两个DLL似乎都在使用多线程调试DLL(/MDd)。这意味着两者都在使用MSVCP100D.dll。这没关系,唯一的问题是qt网站上的qt的VC++版本是在RELEASE模式下编译的,并且正在使用MSVCP100.dll

我的建议是将您的运行库更改为多线程DLL(/MD)以进行DEBUG配置。

我的第二个建议是遵循Rebert的建议,使用char*而不是std::stringchar*无论如何都将兼容。

您也可以使用多线程调试DLL(/MDd)重新编译QT,并将该版本的QT用于您的Debug配置(但这似乎需要做很多工作)。

名义上,我不会冒险在应用程序和DLL之间传递复杂的数据(在代码方面超出我的控制)。我会求助于只传递POD结构,即我会将接口改为:

class CTest: public ITest
{
public:
CTest();
virtual ~CTest();
virtual void getVersion(char* versionBuffer, unsigned length) const;
};

让生活轻松多了;)