我正在尝试在我的C++builder应用程序中使用外部DLL
。 dll(我们称之为X.dll)是用Qt Creator创建的(使用MingW 32位编译器,也尝试了gcc),它由一个单一的函数组成以保持简单(除了X.dll之外,还创建了一个导入库X.a)。
dll头(dll_lib.h)基本上只是
__declspec(dllexport) Dll_method(float *p, int n);
如果我创建了一个简单的Qt应用程序,将dll头添加到其中,并将其链接到dll导入库X.a,everythink将按预期工作。
但是,当我尝试在我的C++builder应用程序中使用dll时,我得到一个“unresolved external_DLL_method referenced from.。。”错误。
我的C++builder应用程序中引用dll的部分如下所示
#include "lib\Dll_lib.h"
#pragma comment(lib, "X.lib")
__declspec(dllimport) Dll_method(float *p, int n);
.....
x.lib是使用C++Builder附带的implib工具直接从dll创建的。 我还尝试使用coff2omf工具从X.A创建X.lib,但没有任何效果,我总是得到相同的错误消息。
C++环境有一个习惯,就是为了支持重载,不同的参数使用相同的名称,比如:
int use(int x, char y); // mangles to something like use__Int__Chr.
int use(double x); // mangles to something like use__Dbl.
这允许根据参数链接正确的一个。
您可能需要将其包装在extern“c”
内,以使其不会破坏名称,例如:
extern "C" {
__declspec(dllimport) Dll_method(float *p, int n);
}
这是假设您创建它的时候没有名称损坏,并且使用它的时候假设它是损坏的。 如果它的两边都被破坏了,那么您可能必须使用extern“c”
创建和使用它,因为不能保证不同的编译器使用相同的规则会被破坏。
顺便说一句,您应该能够检查工具链创建的对象文件或DLL,以确定在定义的地方调用了什么函数,以及调用者期望它是什么。 在Linux下,我会使用类似nm
的东西,我不确定Windows下的等价物是什么。