LNK2019:未解析的外部符号 - 隐式DLL

时间:2014-08-07 20:30:18

标签: c++ c windows dll static-linking

有许多类似的问题,但我几乎已经做了一切来解决这个问题,但似乎没有任何工作

我创建了一个简单的小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,但无济于事

1 个答案:

答案 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文件中的名称与您导出的函数的实际名称相匹配。