我在visual 2010中编写了一个包含大量函数和类的.dll库。当我使用以下方法查看文件的内容时:
dumpbin.exe /EXPORTS myDll.dll使用某种函数位置指针获得长函数名,它看起来如下(.dll中的第二个条目):
2 1 0001100A ?Initialize@codec@codecX@@SANNN@Z = @ILT+5(?Initialize@codec@codecX@@SANNN@Z)这在某种程度上很难理解,但我从其他..dll s中看到了“更好的”过程/函数列表,如下所示:
141 8C 00002A08 PogoDbWriteValueProbeInfo我怎样才能让.dll列表看起来那样呢?
P.S.:我的dll源代码如下所示:
namespace codecX
{
class codec
{
public:
static __declspec(dllexport) double Initialize(double a, double b);
...发布于 2013-02-26 13:27:45
您需要将这些静态成员函数拉到全局地址空间中,然后用extern "C“包装它们。这将抑制C++名称的损坏,而不是给C名称mangling,它不那么难看:
extern "C" __declspec(dllexport) Initialize(double a, double b)
{
codec::Initialize(a, b);
}然后删除静态成员函数上的__declspec(dllexport):
class codec
{
public:
static double Initialize(double a, double b);
}发布于 2013-02-26 13:28:16
这称为name-mangling,当您用C++编译器编译C++时就会发生这种情况。为了保留“humand可读”名称,在声明和定义类和函数时,必须使用extern "C"。即
extern "C" void myFunction(int, int); 请参阅这里和google mixing C and C++。
发布于 2020-06-23 16:03:28
您所看到的是C++对函数名的损坏。
如果需要将此函数保留为C++函数,则可以使用实用工具undname.exe对dumpbin.exe输出进行后处理以获得正常的函数名。
与Microsoft一起提供的实用程序用于卸载C++损坏的函数名,称为undname.exe。
它可用于以下方面:
C:\>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"https://stackoverflow.com/questions/15090196
复制相似问题