Visual Studio C++dll库在Qt应用程序中崩溃
Visual Studio C++ dll library crashes in Qt application
我在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;
};
让生活轻松多了;)
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- QCompleter set模型使应用程序崩溃
- Qt 5 应用程序崩溃并出现"qLineEdit::setText"
- 切换NvAPI_Stereo_Deactivate/NvAPI_Stereo_activate会使unity应用程序崩溃
- eglSwapBuffers上的应用程序崩溃
- VLD 使应用程序崩溃
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- 执行递归函数时 C++ 应用程序崩溃
- 在 C++/CLI/C# 项目中启用"Native Code Debugging"导致应用程序崩溃
- LOCAL_SHARED_LIBRARIES使我的应用程序崩溃
- 为什么使用 nullPtr 调用函数不会使我的应用程序崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- React 本机 0.59 应用程序崩溃并出现 libc 错误
- 当使用“制造”编译的程序中使用库时,应用程序崩溃
- 如何在导致应用程序崩溃的代码中修复指令
- C++多线程应用程序崩溃
- 当使用 /ENTRY:main 和 /MT 运行时库编译为 /SUBSYSTEM:WINDOWS 时,应用程序崩溃