有许多类似的问题,但我几乎已经做了一切来解决这个问题,但似乎没有任何工作
我创建了一个简单的小Dll。
声明:
void func_A()
void func_B()
还有一些其他的东西,我给它一个C ++文件名,但它基本上只有C程序
我写了.def文件
LIBRARY "myLib.dll"
EXPORTS
func_A @1
func_B @2
成功创建了Dll。
我已确保。{1}}
中存在.def文件我还使用properties->linker->input->module definition file
检查了导出的函数,到目前为止一切都很好
现在在客户端代码中,我写了像
这样的标题Dumpbin
确实满足编译器,
已将.lib和.dll从DLL项目复制到客户端项目,已将.lib保存在生成.obj文件的位置,并保留.dll将生成.exe文件。
但我得到 extern "C" __declspec(dllimport) void func_A();
extern "C" __declspec(dllimport) void func_B();
来进行dll函数调用
我想我确信链接器会找到.lib,因为如果删除LNK2019: unresolved external symbol
,我会从链接器中获取Addition Library Dependencies
。
由于没有任何效果,我在创建.dll时也尝试使用.lib file not found error
,但无济于事
答案 0 :(得分:4)
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文件中的名称与您导出的函数的实际名称相匹配。