我在 MS Visual C++ DLL 库和 Qt 程序之间共享“std::string”数据时遇到问题。
我拥有的是:
用 Visual C++ 2010 Express 编写的 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”字符串。当我用新字符串填充“&version”时,我得到的是在线崩溃。
我已经做了什么:
从http://qt-project.org/downloads下载“Qt libraries 4.8.3 for Windows (VS 2010, 235 MB)” ,安装并在 QtCreator 的项目设置中选择它。
在 QtCreator 中,从 MinGW 工具链切换到安装了 MS Visual Studio 2010 Express 的工具链。
我认为它会克服这个问题,因为我使用的是用 VS 2010 编译的 Qt 库,而 Qt GUI 也是用 VS C++ 工具链编译的。不幸的是问题并没有消失,所以我尝试了最后一步:
在 Visual Studio 中创建 Win32 控制台应用程序,通过 LoadLibrary 加载我的 DLL,使用“Init”方法,就像我在 Qt GUI 中所做的一样......它工作了!!
小观察
在“CTest::getVersion()”中,我正在打印这个通过引用传递给控制台的“版本”字符串。当使用 VS C++ 控制台应用程序作为主机时,它会正确打印出来。使用 Qt 应用程序时 - 打印“版本”字符串周围有一些垃圾(例如┌►☻qwerty27)
这让我觉得 Qt 应用程序的 ABI 和我的 DLL 仍然不兼容,即使使用上面提到的 Qt VS 2010 库也是如此。
问题:
- 使用 Windows (VS 2010) 的 Qt 库和 Visual Studio 工具链不足以克服 ABI 兼容性问题吗?
- 这是否意味着我应该自己编译 Qt 框架?
- 请帮助 - 欢迎任何想法......