c++ - 使用带有外部 dll 的 c++ 构建器应用程序
问题描述
我正在尝试external dll
在我的 c++ 构建器应用程序中使用。dll(让我们称之为 X.dll)是用 Qt Creator 创建的(使用 MingW 32 位编译器,也尝试过 gcc)并且由一个函数组成以保持简单(除了 X.dll,一个导入库 Xa 是也创建)。
dll头(Dll_lib.h)基本上只是
__declspec(dllexport) Dll_method(float *p, int n);
如果我创建一个简单的 Qt 应用程序,将 dll 标头添加到其中并将其链接到 dll 导入库 Xa,everythink 会按预期工作。
但是,当我尝试在我的 c++ 构建器应用程序中使用 dll 时,我收到“未解析的外部 _Dll_method 引用自 ... ”错误。
我的 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 工具从 Xa 创建 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# - API Get 需要 Content-Type application/json;charset=UTF-8 - Http 客户端问题
- java - Java:无法弄清楚如何使用 class.getClassLoader().getResourceAsStream() 所以当我构建工件时它可以工作
- c# - 检测统一引用的其他对象的值的变化?
- dart - 如何在 dart 中更改准系统单页 Web 应用程序的内容?
- c++ - 决策和递归函数
- css - 后备 vars vaule 插入括号
- c# - 为什么我不能从 NUnit 项目中测试这个 DAO 项目方法?System.IO.FileNotFoundException 无法加载文件或程序集'System.Data.SqlClient
- c++ - C++ ThreadSafe 计时类
- ios - 为什么 UITableView 滚动时会更新约束?
- actions-on-google - 温度控制特性的可视化界面,谷歌设备操作