Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用c++;具有外部dll的生成器应用程序 我试图在我的C++ Builder应用程序中使用外部DLL。dll(我们称之为X.dll)是使用Qt Creator创建的(使用MingW 32位编译器,还尝试了gcc) 并由一个函数组成,以保持简单(除了X.dll外,还创建了一个导入库X.a)_C++_Qt_Dll - Fatal编程技术网

使用c++;具有外部dll的生成器应用程序 我试图在我的C++ Builder应用程序中使用外部DLL。dll(我们称之为X.dll)是使用Qt Creator创建的(使用MingW 32位编译器,还尝试了gcc) 并由一个函数组成,以保持简单(除了X.dll外,还创建了一个导入库X.a)

使用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_

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_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放在了两端。