我在这里阅读了几篇关于名称修饰/装饰的文章,并且一直遇到不一致的情况,所以我想我会问一个非常集中的问题,看看会发生什么。
我正在努力提高学习曲线,最终能够在 VS2013 中创建一个 dll,该 dll 可由在非常旧的 Borland C++ 编译器上生成的代码使用。第一步是在VS2013中构建一个可以“说话”的exe和dll。我想要未修饰的函数名称。所以我创建了一个带有一个导出函数的 dll。
extern "C" __declspec(dllexport) int __cdecl BasicFileOpen(void);
我的有限理解是:
- extern "C" 表示没有装饰
- __declspec(dllexport) 表示导出函数
- __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