【问题标题】:LNK2019: unresolved external symbol -- Implicit DLL [duplicate]LNK2019:未解析的外部符号——隐式 DLL [重复]
【发布时间】:2014-08-07 20:30:18
【问题描述】:

有很多类似的问题,但我几乎已经做了所有的事情来解决这个问题,但似乎没有任何效果

我创建了一个简单的小 Dll。

声明:

void func_A()
void func_B()

还有一些其他的东西,我给了它一个 C++ 文件名,但它基本上只是 C 程序

我已经写好了.def文件

LIBRARY "myLib.dll"

EXPORTS
    func_A          @1
    func_B          @2

Dll 创建成功。

我已确保properties->linker->input->module definition file 中存在 .def 文件

我还检查了使用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

由于没有任何效果,我也尝试在创建 .dll 时使用 __declspec(dllexport),但无济于事

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2014-11-07
    • 2013-06-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2022-01-06
    • 2014-09-19
    • 2012-12-17
    相关资源
    最近更新 更多