C++ C++;:找出被修饰的名字
我怎样才能找到每个方法名的修饰名?我试图找出修饰名是什么,以便在DLL中导出它。这个问题非常类似:。快速总结是,您可能希望使用C++ C++;:找出被修饰的名字,c++,dll,export,name-mangling,C++,Dll,Export,Name Mangling,我怎样才能找到每个方法名的修饰名?我试图找出修饰名是什么,以便在DLL中导出它。这个问题非常类似:。快速总结是,您可能希望使用\uu declspec(dllexport)让编译器为您导出方法 Microsoft在每一个编译器版本中都改变了函数名损坏(或他们称之为“修饰名”)的方式,因此,如果您试图手动导出损坏的名称,则将来可能会遇到维护问题。如果你使用谷歌来做“MSVC修饰名”,那么有些链接可能会有帮助,但没有保证。 < P>因为C++名称的篡改不是在不同编译器之间匹配的(如所提到的,甚至在同
\uu declspec(dllexport)
让编译器为您导出方法
Microsoft在每一个编译器版本中都改变了函数名损坏(或他们称之为“修饰名”)的方式,因此,如果您试图手动导出损坏的名称,则将来可能会遇到维护问题。如果你使用谷歌来做“MSVC修饰名”,那么有些链接可能会有帮助,但没有保证。 < P>因为C++名称的篡改不是在不同编译器之间匹配的(如所提到的,甚至在同一个供应商的编译器版本之间也会发生变化),而且没有C++的标准二进制接口。从DLL导出C++函数通常不是一个好主意。如果DLL与使用它的应用程序紧密绑定并进行版本控制,则会出现例外情况
另一种方法是将导出的函数声明为
extern“C”
我认为您应该听取前两位响应者的建议,但是如果您使用的是Microsoft工具链,并且确实想知道修饰的名称。。。
导出函数,将它们作为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():)编译器本身可以解决这个问题。例如,查看链接器映射文件。