2

我编写了一个 dll,它使用抽象接口来允许访问里面的 c++ 类。当我在运行时使用LoadLibrary()函数使用在 eclipse 中使用 g++ 创建的简单控制台动态加载库并从 dll 中调用函数时,我得到了返回的正确值。然而,当使用 qt-creator qt5 和 g++ 编译器编写相同的控制台程序时,我得到完全不同的不正确结果。

所有这些都是在 Windows 7 64 位下编写的,但在程序中使用了它的 x86 端。

从 Eclipse 调用 dll 的代码如下所示:

HMODULE hMod = ::LoadLibrary("libTestDll.dll");

if (hMod) {
    cout << "Library Loaded" << endl;
    CreateITestType create = (CreateITestType) GetProcAddress(hMod,
            "GetNewITest");

    ITest* test = create();

    std::cout << test->Sub(20, 5) << std::endl;
    std::cout << test->Sub(20, 3) << std::endl;
    std::cout << test->Add(20, 5) << std::endl;
    std::cout << test->Add(13, 4) << std::endl;

   DeleteITestType del = (DeleteITestType) GetProcAddress(hMod,
   "DeleteITest");
    del(test);
    test = NULL;
    FreeLibrary(hMod);
   }

这将返回:

Library Loaded
15
17
25
17

从 qt 调用 dll 的代码如下所示:

HMODULE hMod = LoadLibrary(TEXT("libTestDll.dll"));

if(hMod)
{
    CreateITestType create = (CreateITestType)GetProcAddress(hMod, "GetNewITest");
    DeleteITestType destroy = (DeleteITestType)GetProcAddress(hMod, "DeleteITest");

    ITest* test = create();

    std::cout << test->Sub(20, 5) << std::endl;
    std::cout << test->Sub(20, 3) << std::endl;
    std::cout << test->Add(20, 5) << std::endl;
    std::cout << test->Add(13, 4) << std::endl;

    destroy(test);
    test = NULL;

    FreeLibrary(hMod);
}

这将返回:

1
-17
25
24

这两个程序都有导入:

#include <windows.h>
#include <iostream>
#include "TestDll.h"

最后函数实现如下:

int Test::Add(int a, int b)
{
    return (a+b);
}

int Test::Sub(int a, int b)
{
    return (a-b);
}

我的问题是,由于这两个程序在代码和编译器上都是相同的,所以区别在哪里,如何解决这个问题?

4

1 回答 1

2

您是否还用 重建了 DLL qt-creator qt5 with the g++ compiler?如果不是,那么您会发现,如果您不使用完全相同的编译器、编译器选项和设置、定义以及构建系统的几乎所有其他方面,C++ 接口通常与 ABI 不兼容。

于 2013-05-21T16:41:27.130 回答