导出未修饰的函数名称

时间:2014-12-06 01:29:49

标签: c++ visual-studio dll dllexport name-decoration

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

我正努力在学习曲线上努力,最终能够在VS2013中创建一个dll,可以在非常古老的Borland C ++编译器上生成代码。第一步是在VS2013中构建一个可以" talk"的exe和dll。我想要未修饰的函数名称。所以我用一个导出的函数创建了一个dll。

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

我的理解有限:

  1. extern" C"意味着没有装饰
  2. __ declspec(dllexport)表示导出函数
  3. __ cdecl指定调用签名(参数如何放入堆栈等)
  4. 当我使用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函数的头文件。 为什么链接器不了解导出函数的名称? 为什么它认为函数名称是装饰的? BTW使用.def文件似乎没有任何区别。

    感谢任何评论。

    MBB

0 个答案:

没有答案
相关问题