将 c++ 生成器应用程序与外部 dll 结合使用
Using a c++ builder application with an external dll
我正在尝试在我的 c++ 构建器应用程序中使用external 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,则每个人都会按预期工作。
但是,当我尝试在我的 c++ 构建器应用程序中使用 dll 时,我得到一个">未解析的外部_Dll_method引用自......"错误。
我的 c++ 构建器应用程序中引用 dll 的部分看起来像
#include "libDll_lib.h"
#pragma comment(lib, "X.lib")
__declspec(dllimport) Dll_method(float *p, int n);
.....
X.lib 是使用 c++ 构建器附带的 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++:将外部库链接到dll库
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- 外部"C"与类和 DLL
- 如何将外部 dll 添加到我的 VS2019 项目?
- DLL+导出类+模板成员func=未解析的外部符号.任何修复的机会
- 全局外部指针变量在 DLL 中不可见
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 尝试针对 dll 链接时未解析的外部
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- 从dll传递c字符串,穿过外部C
- 将 C 中的外部 DLL 追加到 C# 中的 WinForm 项目
- 如何包含具有多个 dll/dylib 的外部(共享)库
- C++ DLL:未解析的外部符号
- 如何调试在外部C#应用中旋转的C DLL(从调试器无法启动)
- 当您的外部SDK仅具有.dll,.lib,.h文件时,如何链接和构建项目
- 未解决的外部符号,带有ftd3xx.dll
- 在VS中编译程序,无需外部运行时DLL