我已经在Visual Studio 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列表看起来像这样?
PS:我的dll源代码如下所示:
namespace codecX { class codec { public: static __declspec(dllexport) double Initialize(double a, double b); ...
您需要将这些静态成员函数拉入全局地址空间,然后用extern“C”来包装它们。 这将抑制C ++的名称mangling,而不是给你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); }
这就是所谓的名字重组 ,当你用C ++编译器编译C ++时会发生这种情况。 为了保留“humand可读”名称,在声明和定义类和函数时,必须使用extern "C"
。 即
extern "C" void myFunction(int, int);
看到这里 ,还有谷歌mixing C and C++
。