1

我在这里阅读了几篇关于名称修饰/装饰的文章,并且一直遇到不一致的情况,所以我想我会问一个非常集中的问题,看看会发生什么。

我正在努力提高学习曲线,最终能够在 VS2013 中创建一个 dll,该 dll 可由在非常旧的 Borland C++ 编译器上生成的代码使用。第一步是在VS2013中构建一个可以“说话”的exe和dll。我想要未修饰的函数名称。所以我创建了一个带有一个导出函数的 dll。

extern "C" __declspec(dllexport) int __cdecl BasicFileOpen(void);

我的有限理解是:

  1. extern "C" 表示没有装饰
  2. __declspec(dllexport) 表示导出函数
  3. __cdecl 指定调用签名(参数如何放入堆栈等)

当我使用 DependencyWalker 或 Dumpbin /EXPORTS 检查 dll 时,函数名称未修饰。耶。

这是 exe 中尝试调用 dll 中导出函数的代码:

void CCallsCIDdllDlg::OnBnClickedOk()
{
    int iRetVal = BasicFileOpen();

    // TODO: Add your control notification handler code here
    CDialogEx::OnOK();
}

但是,当我尝试构建 exe 时,出现链接器错误。

error LNK2019: unresolved external symbol _BasicFileOpen referenced in function 
"public: void __thiscall CCallsCIDdllDlg::OnBnClickedOk(void)" 
(?OnBnClickedOk@CCallsCIDdllDlg@@QAEXXZ)

请注意,exe 提到_BasicFileOpen。我对此感到困惑。我已经正确地指出了由 dll 构建生成的 lib 文件。我在 exe 中包含了 dll 函数的头文件。为什么链接器不理解导出函数的名称?为什么它认为函数名被修饰了?顺便说一句,使用 .def 文件似乎没有任何区别。

任何意见表示赞赏。

MBB

4

0 回答 0