gpt4 book ai didi

c++ - 将C++ Builder应用程序与外部dll一起使用

转载 作者:行者123 更新时间:2023-12-02 10:30:00 32 4
gpt4 key购买 nike

我正在尝试在我的C++构建器应用程序中使用external dll。 dll(我们称其为X.dll)是使用Qt Creator创建的(使用MingW 32位编译器,也尝试过gcc)
并包含一个使功能保持简单的功能(除了X.dll之外,还创建了导入库X.a)。
dll header (Dll_lib.h)基本上只是

__declspec(dllexport)  Dll_method(float *p, int n);
如果我创建一个简单的Qt应用程序,则向其添加dll header 并将其链接到dll导入库X.a,everythink会按预期工作。
但是,当我尝试在我的c++构建器应用程序中使用dll时,出现“... ... 引用的 无法解析的外部_Dll_method”错误。
我的c++生成器应用程序中引用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的等效形式。

关于c++ - 将C++ Builder应用程序与外部dll一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62594688/

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