C ++:找出装饰的名字

时间:2008-10-10 06:36:00

标签: c++ dll export name-mangling

如何找出将分配给每个方法名称的装饰名称?我试图找出装饰名称是什么,以便我可以在DLL中导出它。

6 个答案:

答案 0 :(得分:7)

.DEF文件仍然正在使用?

忘记.DEF文件。他们已成为过去。

通过__declspec(dllimport / dllexport)导出您的函数,无论是C函数还是C ++符号。

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

您确定要删除C ++装饰吗?

有一些正当理由:您希望导出将由C代码使用的代码,或者您希望从使用不同编译器编译的模块中使用您的DLL。

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

除了这些原因,为什么要删除装饰?

C ++装饰/名称修改不是邪恶

恰恰相反。

如果你正在使用一个编译器(,我想你这样做,因为你想使用装饰的名称,而不是extern“C”的),那么保持C ++装饰/名称错误。

通过这种方式,您将能够使用完整的C ++功能,即名称空间,类,函数/方法重载等。

尽管如此,使用符号装饰手动播放仍然是一种灾难:使用dllexport导出符号而无需处理另一个(.DEF)文件。

答案 1 :(得分:5)

这个问题很相似:Exporting DLL C++ Class , question about .def file。快速摘要是您可能希望使用__declspec(dllexport)让编译器为您导出方法。

Microsoft改变了它们对每个编译器版本进行函数名称修改(或称为“装饰名称”)的方式,因此如果您尝试手动导出损坏的名称,可能会遇到未来的维护问题。如果你谷歌搜索“msvc装饰名称”,有一些链接可能会有所帮助,但不能保证。

答案 2 :(得分:2)

由于C ++名称修改不是在不同的编译器之间匹配(如Greg Hewgill提到的,它甚至可以在同一供应商的编译器的版本之间改变)并且没有用于C ++的标准二进制接口,它通常不是从DLL导出C ++函数是个好主意。例外情况是,如果DLL与使用它的应用程序紧密绑定并进行版本控制。

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

答案 3 :(得分:2)

在目标文件上使用 dumpbin ,您将找到该对象中使用的所有方法。这是它的使用方式

dumpbin /symbols File.obj

答案 4 :(得分:0)

我认为您应该接受前两个响应者Greg HewgillMike B的建议,但如果您使用的是Microsoft工具链,并且您真的想知道装饰的名称。 。

  1. 使用 __ declspec(dllexport)创建.lib和.dll文件
  2. 使用dumpbin / exports
  3. 检查dll导出的名称
  4. 现在您可以删除 __ declspec(dllexport)并在 .def 文件中手动导出符号

答案 5 :(得分:0)

在VS2005中,当放置在函数中时,预处理器宏FUNCDNAME返回带有装饰名称的字符串。然而,这是非标准的--C99标准有func,我不能说你的编译器是否支持它。

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

(编辑:)这显然最近出现在similar discussion