C++ dll函数的名称装饰,#pragma注释(链接器…)

C++ dll函数的名称装饰,#pragma注释(链接器…),c++,dll,export,C++,Dll,Export,我有两个关于导出函数名的问题。 我浏览了MSDN示例: 为什么我可以用未修饰的名称访问dll函数?没有.def文件。正如MSDN所述: “C++函数的DLEx出口将使函数用C++名字进行修改,”我想知道为什么它会起作用。 如果我删除\u declspec(dllexport)resp。宏,并使用 #pragma comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__) 在功能主体内,例如: double __stdcall Extern

我有两个关于导出函数名的问题。 我浏览了MSDN示例:

  • 为什么我可以用未修饰的名称访问dll函数?没有
    .def
    文件。正如MSDN所述: “C++函数的DLEx出口将使函数用C++名字进行修改,”我想知道为什么它会起作用。
  • 如果我删除
    \u declspec(dllexport)
    resp。宏,并使用

    #pragma comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__)
    
    在功能主体内,例如:

     double __stdcall ExternalAdd(double arg1, double arg2)
     {
     #pragma comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__)
          return arg1 + arg2;
    } 
    
    我得到一个链接器错误。为什么?

  • dll上的
    dumpbin/Exports
    显示:

    ExternalAdd = @ILT+720(?ExternalAdd@@YGNNN@Z)
    
    库上的
    dumpbin/Headers
    显示:

    Symbol name  : ExternalAdd
    ...
    Name         : ExternalAdd
    

    非常感谢您的帮助。

    您是否转储了库以检查函数是否正在实际导出,以及函数名称是否正确?您指出的两个示例都不是链接示例的一部分。对于1,您不能使用未修饰的名称访问函数。修饰名称来自函数声明(名称空间、类等),因此当您在隐式链接中包含头文件时,编译器知道在导入中查找什么。@captainObjective不使用链接器命令显示:ExternalAdd=@ILT+230(?ExternalAdd@@YGNNN@Z)与uu declspec(dllexport)一起工作的显示:?外部添加@@YGNNN@Z=@ILT+230(?外部添加)@@YGNNN@Z)@Andre
    1.为什么我可以用未修饰的名称访问dll函数?
    您通常不能这样做。在这里帮助你的是链接器。尝试使用不同的编译器(如gcc)或其他语言(如C#、VB等)访问该函数。您将看到必须通过其修饰名访问该函数。这就是.DEF文件发挥作用的地方。