Visual Studio的C ++ dll库崩溃的Qt应用程序(Visual Studio C++

2019-08-01 02:38发布

我有一个问题,分享微软的Visual C ++ DLL库和Qt程序之间“的std :: string”数据。

我有什么分别是:

  • DLL库用Visual C ++ 2010速成,其中出口一个方法:

     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的“初始化”一“CTEST :: getVersion()”方法被调用。 我希望它会得到“及版本”字符串填充的。我得到什么,而不是上线崩溃时我填写“及版本”与新的字符串。

我已经做了:

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

  • 在QtCreator从MinGW的工具链切换到一个与微软的Visual Studio 2010中快速安装。

    我认为这将解决这个问题,因为我用VS 2010和Qt GUI编译还与VS C ++编译工具链,然后Qt库。 不幸的是,问题并没有消失,所以我想最后一步:

  • 在Visual Studio中创建Win32控制台应用程序,通过加载调用LoadLibrary我的DLL,使用“初始化”方法相同的方式,我做了Qt中的GUI ...和它的工作!

小观察

在“CTEST :: getVersion()”我打印参考控制台通过这个“版本”的字符串。 当使用VS C ++控制台应用程序作为宿主其被正确地打印出来。 当使用Qt应用 - “版本”字符串印刷有周围的一些垃圾(例如┌►☻qwerty27)

这让我觉得,Qt的应用程序,我的DLL的ABI仍是不兼容的,使用Qt VS上面提到的2010个库时也是如此。

问题:

  • 正在使用的Windows(VS 2010)Qt库和Visual Studio工具链不足以克服ABI兼容性问题?
  • 这是否意味着我应该编译我自己的Qt框架?
  • 请帮助 - 任何想法,欢迎...

Answer 1:

在一个项目中,我有很多喜欢你的,两个DLL,相同的编译器(VC ++ 2010)的情况。 我是路过的std :: string从一个到另一个,并获得了大量的崩溃。

问题是一个DLL用多线程调试DLL(/ MDD)和其他与多线程调试(/ MTD)这引起了两个DLL(崩溃)之间的二进制不相容编译。 另外,版本必须匹配,两个DLL文件或者使用DEBUG或释放。

看你的项目,这两个DLL文件似乎可以用多线程调试DLL(/ MDD)。 这意味着这两种使用MSVCP100D.dll。 这是确定的,唯一的问题是,VC ++版本从QT网站的Qt在发布模式下编译并使用MSVCP100.DLL

我的建议是改变你的运行时库的多线程DLL(/ MD)的调试配置。

我的第二个建议是遵循Rebert的建议和使用的char *代替的std :: string。 字符*将是兼容的,无论是什么。

你也可以用多线程调试DLL(/ MDD)编译QT和使用该版本的QT的调试配置(但这似乎想太多的工作)。



Answer 2:

名义上,我不会冒险进入应用程序和DLL之间传递复杂的数据(在我的掌握,codewise的)。 我将诉诸只有通过POD结构,即我将接口改为这个:

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

让生活变得更加简单;)



文章来源: Visual Studio C++ dll library crashes in Qt application