C++ dll函数的名称装饰,#pragma注释(链接器…)
我有两个关于导出函数名的问题。 我浏览了MSDN示例: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
.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;
}
我得到一个链接器错误。为什么?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文件发挥作用的地方。