Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:找出被修饰的名字_C++_Dll_Export_Name Mangling - Fatal编程技术网

C++ C++;:找出被修饰的名字

C++ C++;:找出被修饰的名字,c++,dll,export,name-mangling,C++,Dll,Export,Name Mangling,我怎样才能找到每个方法名的修饰名?我试图找出修饰名是什么,以便在DLL中导出它。这个问题非常类似:。快速总结是,您可能希望使用\uu declspec(dllexport)让编译器为您导出方法 Microsoft在每一个编译器版本中都改变了函数名损坏(或他们称之为“修饰名”)的方式,因此,如果您试图手动导出损坏的名称,则将来可能会遇到维护问题。如果你使用谷歌来做“MSVC修饰名”,那么有些链接可能会有帮助,但没有保证。 < P>因为C++名称的篡改不是在不同编译器之间匹配的(如所提到的,甚至在同

我怎样才能找到每个方法名的修饰名?我试图找出修饰名是什么,以便在DLL中导出它。

这个问题非常类似:。快速总结是,您可能希望使用
\uu declspec(dllexport)
让编译器为您导出方法


Microsoft在每一个编译器版本中都改变了函数名损坏(或他们称之为“修饰名”)的方式,因此,如果您试图手动导出损坏的名称,则将来可能会遇到维护问题。如果你使用谷歌来做“MSVC修饰名”,那么有些链接可能会有帮助,但没有保证。

< P>因为C++名称的篡改不是在不同编译器之间匹配的(如所提到的,甚至在同一个供应商的编译器版本之间也会发生变化),而且没有C++的标准二进制接口。从DLL导出C++函数通常不是一个好主意。如果DLL与使用它的应用程序紧密绑定并进行版本控制,则会出现例外情况


另一种方法是将导出的函数声明为
extern“C”

我认为您应该听取前两位响应者的建议,但是如果您使用的是Microsoft工具链,并且确实想知道修饰的名称。。。

  • 使用u declspec(dllexport)创建.lib和.dll文件
  • 使用dumpbin/exports检查dll导出的名称
  • 现在,您可以删除_declspec(dllexport)并在.def文件中手动导出符号
  • .DEF文件是否仍在使用? 忘记.DEF文件。它们已经成为过去

    导出函数,将它们作为C函数或C++符号,通过yO-DEXSPEC(DLimPurt/DLLut导出).

    如果您确实需要未修饰的名称,请按照Greg Hewgill的建议使用uu declspec(dllimport/dllexport)关键字,并结合外部“C”,这将去除这些符号的装饰性

    确实要删除C++装饰吗? 这有一些合理的理由:您想要导出C代码将使用的代码,或者您想要从使用不同编译器编译的模块中使用DLL

    第二个原因是,我会为每个编译器生成一个DLL,并保留装饰

    撇开这些原因不谈,你为什么要把装饰品拿走

    C++装饰/名称的修饰不是邪恶的 恰恰相反

    如果你使用一个编译器(我想你是这样做的,因为你想使用修饰名,而不是外部的C),那么保持C++修饰/名称的修饰。

    这样,您就可以使用完全C++的电源,即命名空间、类、函数/方法重载等。


    尽管如此,手动玩符号装饰还是会带来灾难:使用dllexport导出符号而不必处理另一个(.DEF)文件。

    通过在对象文件上使用dumpbin,您将找到对象中使用的所有方法。下面是它的用法

    dumpbin /symbols File.obj
    

    在VS2005中,有一个预处理器宏,它在函数中放置时返回带有修饰名称的字符串。然而,这是非标准的——C99标准对此有所规定,我不能说您的编译器是否支持这一点

    (为什么o为什么下划线显示不正确??)


    (编辑:)这显然是最近在一篇文章中提到的。

    我知道UndercorateSymbolName()存在。我想知道是否有一些DecorateSymbolName():)编译器本身可以解决这个问题。例如,查看链接器映射文件。