C++ 导出未修饰的函数名

C++ 导出未修饰的函数名,c++,visual-studio,dll,dllexport,name-decoration,C++,Visual Studio,Dll,Dllexport,Name Decoration,我在这里读了好几篇关于名字弄乱/装饰的文章,一直遇到不一致的地方,所以我想我应该问一个非常集中的问题,看看会发生什么 我试图通过学习曲线来最终在VS2013中创建一个DLL,它可以在一个非常老的Borland C++编译器上生成代码。第一步是在VS2013中构建一个可以“对话”的exe和dll。我想要未修饰的函数名。因此,我创建了一个带有一个导出函数的dll extern "C" __declspec(dllexport) int __cdecl BasicFileOpen(void); 我有

我在这里读了好几篇关于名字弄乱/装饰的文章,一直遇到不一致的地方,所以我想我应该问一个非常集中的问题,看看会发生什么

<>我试图通过学习曲线来最终在VS2013中创建一个DLL,它可以在一个非常老的Borland C++编译器上生成代码。第一步是在VS2013中构建一个可以“对话”的exe和dll。我想要未修饰的函数名。因此,我创建了一个带有一个导出函数的dll

extern "C" __declspec(dllexport) int __cdecl BasicFileOpen(void);
我有限的理解是:

  • 外部“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提到了\u BasicFileOpen。 我对此感到困惑。 我已经正确地指出了dll构建生成的lib文件。 我在exe中包含dll函数的头文件。 为什么链接器不理解导出函数的名称? 为什么它认为函数名是修饰的? 顺便说一句,使用.def文件似乎没有任何区别

    如有任何意见,我们将不胜感激

    MBB

    extern“C”
    C语言绑定,因此C默认为所有内容<代码>\uuuCDECL将调用转换更改为
    \uuCDECL
    外部“C”
    并不表示“无装饰”。它表示“使用C装饰”。如果不需要装饰,请使用DEF文件。