有许多与此类似的问题,但我几乎已尽一切努力解决了该问题,但似乎无济于事
我创建了一个小的简单Dll。
声明:
void func_A()
void func_B()
还有其他一些东西,我给了它一个C ++文件名,但是它基本上只是C程序
我已经写了.def文件
LIBRARY "myLib.dll"
EXPORTS
func_A @1
func_B @2
DLL创建成功。
我确保其中存在.def文件 properties->linker->input->module definition file
我还检查了使用的导出功能Dumpbin
,到目前为止一切都很好
现在在客户端代码中,我已经写了标题
extern "C" __declspec(dllimport) void func_A();
extern "C" __declspec(dllimport) void func_B();
确实满足编译器的要求,
将.lib和.dll从DLL项目复制到客户端项目,将.lib保存在生成.obj文件的位置,并将.dll保存在生成.exe的位置。
但是我得到LNK2019: unresolved external symbol
了dll函数调用
我想我确定链接器可以找到.lib,因为如果删除,Addition Library Dependencies
我.lib file not found error
将从链接器中获取。
由于没有任何反应,我也尝试__declspec(dllexport)
在创建.dll时使用,但无济于事
Now In client code, I have written header like
太晚了。您已经将库编译为带有C ++名称的C ++文件。您在客户端代码中所做的操作不会有任何区别。
可能的问题是您的第一步,那就是使用以下函数名称编译DLL:
void func_A();
void func_B();
如果将其编译为C ++文件,这些名称将被修饰。如果这些名称被篡改,则您的DEF文件必须导出被篡改的名称,而不是“干净”名称。
为了确保这些名称不被篡改,正确的方法如下:
#ifdef __cplusplus
extern "C" {
#endif
void func_A();
void func_B();
#ifdef __cplusplus
}
#endif
现在,当将其编译为C ++模块时,名称不会被修饰,并且DEF文件中的名称现在与您要导出的函数的实际名称匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句