gpt4 book ai didi

c++ - 从 DLL 返回的值在直接 g++ 和使用 g++ 的 qt 之间不同

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:30 24 4
gpt4 key购买 nike

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

所有这些都是在 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);
}

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

最佳答案

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

关于c++ - 从 DLL 返回的值在直接 g++ 和使用 g++ 的 qt 之间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16675110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com