如何找出将分配给每个方法名称的装饰名称?我试图找出装饰名称是什么,以便我可以在DLL中导出它。
答案 0 :(得分:7)
忘记.DEF文件。他们已成为过去。
通过__declspec(dllimport / dllexport)导出您的函数,无论是C函数还是C ++符号。
如果您确实需要未修饰的名称,请按照Greg Hewgill的建议使用__declspec(dllimport / dllexport)关键字,结合外部“C”,这将剥去其装饰的符号......
有一些正当理由:您希望导出将由C代码使用的代码,或者您希望从使用不同编译器编译的模块中使用您的DLL。
由于第二个原因,我会为每个编译器生成一个DLL,并保留装饰。
除了这些原因,为什么要删除装饰?
恰恰相反。
如果你正在使用一个编译器(,我想你这样做,因为你想使用装饰的名称,而不是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 Hewgill和Mike B的建议,但如果您使用的是Microsoft工具链,并且您真的想知道装饰的名称。 。
答案 5 :(得分:0)
在VS2005中,当放置在函数中时,预处理器宏FUNCDNAME返回带有装饰名称的字符串。然而,这是非标准的--C99标准有func,我不能说你的编译器是否支持它。
(为什么o为什么下划线没有正确显示?)
(编辑:)这显然最近出现在similar discussion。