我有一个问题,需要在 MS Visual C++ DLL 库和 Qt 程序之间共享“std::string”数据。
这使我认为Qt应用程序和我的DLL的ABI仍然不兼容,即使使用了上面提到的Qt VS 2010库。
问题:
我拥有的是:
DLL library written in Visual C++ 2010 Express, which exports one method:
extern "C" __declspec(dllexport) int Init(ITest* commandTest);
Abstract interface "ITest" and a class implementing it:
class CTest: public ITest { public: CTest(); virtual ~CTest(); virtual void getVersion(std::string & version) const; };
Qt GUI application that needs to:
* load the DLL dynamically * instantiate CTest and pass it to exported Init method.
我已经做过的事情:
从http://qt-project.org/downloads下载了 "Qt libraries 4.8.3 for Windows (VS 2010, 235 MB)",安装并在 QtCreator 的项目设置中选择它。
在 QtCreator 中切换到安装有 MS Visual Studio 2010 Express 的工具链,以解决问题。
我以为这样就能解决问题了,因为我使用了使用 VS 2010 编译的 Qt 库,并且 Qt GUI 也是使用 VS C++ 工具链编译的。不幸的是,问题仍然存在,所以我尝试了最后一步:
在 Visual Studio 中创建 Win32 控制台应用程序,通过 LoadLibrary 加载我的 DLL,以与我在 Qt GUI 中使用 "Init" 方法相同的方式使用了 "Init" 方法... 然后它奏效了!
小观察
在“CTest::getVersion()”中,我将通过引用传递的“version”字符串打印到控制台。当使用VS C++控制台应用程序作为主机时,它会正确地打印出来。但是当使用Qt应用程序时,“version”字符串会带有一些垃圾字符(例如┌►☻qwerty27)。这使我认为Qt应用程序和我的DLL的ABI仍然不兼容,即使使用了上面提到的Qt VS 2010库。
问题:
- 使用Windows(VS 2010)的Qt库以及Visual Studio工具链是否足以解决ABI兼容性问题?
- 这是否意味着我应该自己编译Qt框架?
- 请帮忙 - 欢迎任何想法...
std::string
实现构建的,这将会是一个问题,可以通过自己构建Qt来解决。 - tmpearcestd::string
对象在发布版和调试版构建中默认具有不同的表示方式(具体取决于_ITERATOR_DEBUG_LEVEL
宏设置)。如果您的 DLL 和 Qt 应用程序具有不同的_ITERATOR_DEBUG_LEVEL
设置,则std::string
对象将不同。 - Michael Burr