使用c++;具有外部dll的生成器应用程序 我试图在我的C++ Builder应用程序中使用外部DLL。dll(我们称之为X.dll)是使用Qt Creator创建的(使用MingW 32位编译器,还尝试了gcc) 并由一个函数组成,以保持简单(除了X.dll外,还创建了一个导入库X.a)
dll头(dll_lib.h)基本上是使用c++;具有外部dll的生成器应用程序 我试图在我的C++ Builder应用程序中使用外部DLL。dll(我们称之为X.dll)是使用Qt Creator创建的(使用MingW 32位编译器,还尝试了gcc) 并由一个函数组成,以保持简单(除了X.dll外,还创建了一个导入库X.a),c++,qt,dll,C++,Qt,Dll,dll头(dll_lib.h)基本上是 __declspec(dllexport) Dll_method(float *p, int n); 如果我创建一个简单的Qt应用程序,将dll头添加到其中,并将其链接到dll导入库X.a,everythink将按预期工作 但是,当我尝试在我的C++ Builder应用程序中使用DLL时,我得到了一个“未解析的外部的.yDLIL方法,从…”错误。 我引用C++的C++Builder应用程序的一部分看起来像 #include "lib\Dll_
__declspec(dllexport) Dll_method(float *p, int n);
如果我创建一个简单的Qt应用程序,将dll头添加到其中,并将其链接到dll导入库X.a,everythink将按预期工作
但是,当我尝试在我的C++ Builder应用程序中使用DLL时,我得到了一个“<强>未解析的外部的.yDLIL方法,从…”错误。
<>我引用C++的C++Builder应用程序的一部分看起来像#include "lib\Dll_lib.h"
#pragma comment(lib, "X.lib")
__declspec(dllimport) Dll_method(float *p, int n);
.....
X.lib是使用C++的Builder绑定的,使用DILL工具直接从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的等价物是什么。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的等价物是什么。我已经试过了,同样的错误,但还是要谢谢。@dsp\U用户:你编译的两面都有问题吗?根据更新,没有规定不同的环境使用相同的规则进行破坏。最好在创建函数的地方和调用函数的地方都关闭它。我尽量不在两边都使用名称损坏(两边都使用外部C)。让我看看我是否能找出导入库中到底写了什么。是的,是名字弄乱了。我错误地认为我把extern c放在了两端。我已经试过了,同样的错误,但还是要谢谢你。@dsp\U用户:你是在用mangling编译两端吗?根据更新,没有规定不同的环境使用相同的规则进行破坏。最好在创建函数的地方和调用函数的地方都关闭它。我尽量不在两边都使用名称损坏(两边都使用外部C)。让我看看我是否能找出导入库中到底写了什么。是的,是名字弄乱了。我错误地认为我把外部c放在了两端。