首页  >  文章  >  后端开发  >  如何控制 C DLL 中的导出函数名称:修饰与未修饰?

如何控制 C DLL 中的导出函数名称:修饰与未修饰?

Patricia Arquette
Patricia Arquette原创
2024-11-17 01:32:03660浏览

How to Control Exported Function Names in C   DLLs: Decorated vs. Undecorated?

C DLL 导出:修饰和未修饰的名称

从 C DLL 导出函数时,您可能会遇到修饰(损坏)的名称。此行为是由编译器用于解析 C 中符号名称的名称修饰机制引起的。

模块定义文件 (.def)

使用模块定义文件时,您明确指定导出函数的名称。但是,编译器仍然向导出的符号名称添加修饰后缀。这是函数名称的变形版本,其中包括有关函数参数、返回类型和其他详细信息的信息。

extern "C" Export

导出函数使用“extern“C””语法可以防止编译器对函数名称进行名称修改。但是,它不会删除“=”之后的附加后缀。

Pragma Comment

显式导出函数的另一种方法是使用 #pragma comment 链接器指示。该指令允许您指定要导出的修饰函数名称。例如:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

此指令指示链接器使用提供的修饰名称导出“SomeFunction”函数。

FUNCTION

另一个选项是在函数体内使用 FUNCTION 宏。该宏扩展为未修饰的函数名称。然后,您可以使用 pragma comment 指令导出具有修饰名称的函数,如下所示:

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

此技术允许您指定修饰名称而无需显式指定它。

通过采用这些方法中的任何一种,您都可以控制导出的函数名称,并避免使用 .def 文件或“extern “C””语法时可能出现的不需要的“=”和修饰后缀。

以上是如何控制 C DLL 中的导出函数名称:修饰与未修饰?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn