9

我在 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 框架?
  • 请帮助 - 欢迎任何想法......
4

2 回答 2

1

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

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

查看您的项目,两个 DLL 似乎都在使用Multi-threaded Debug DLL (/MDd)。这意味着两者都在使用MSVCP100D.dll。没关系,唯一的问题是QT网站的VC++版本的qt是在RELEASE模式下编译的,使用的是MSVCP100.DLL

我的建议是将您的运行时库更改为用于调试配置的多线程 DLL (/MD) 。

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

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

于 2013-01-05T10:04:55.987 回答
0

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

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

让生活更轻松;)

于 2012-12-03T07:38:24.783 回答