【问题标题】:DLL function names using dumpbin.exe使用 dumpbin.exe 的 DLL 函数名称
【发布时间】:2013-02-26 13:21:49
【问题描述】:

我在 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 列表看起来像这样?

P.S.:我的 dll 源代码如下所示:

namespace codecX
{
   class codec
   {
      public:
      static __declspec(dllexport) double Initialize(double a, double b);
      ...

【问题讨论】:

  • 您确定要导出未损坏的名称吗?如果你这样做,那么你将无法使用函数重载。看起来您正在导出一个 C++ 类。您是在导出实例方法、构造函数等,还是所有方法都是静态的?
  • David H.,是的,我的目的是导出人类可读的格式。为什么?我需要将创建的 .dll 传递给其他同事,并且具有可读格式对于很好地理解其他人编写的源代码和/或库至关重要。 :)

标签: c++ windows visual-studio-2010 dll


【解决方案1】:

您需要将这些静态成员函数拉入全局地址空间,然后用 外部“C”。这将抑制 C++ 名称修饰,而是为您提供不那么难看的 C 名称修饰:

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);
}

【讨论】:

    【解决方案2】:

    这称为 name-mangling,当您使用 C++ 编译器编译 C++ 时会发生这种情况。 为了保留“人类可读”的名称,您必须在声明和定义您的类和函数时使用extern "C"。即

    extern "C" void myFunction(int, int); 
    

    here 和谷歌mixing C and C++

    【讨论】:

    • @DavidHeffernan 让我们同意我忘记了,好吗 ;) ?当然,你是对的。
    【解决方案3】:

    您看到的是函数名称的 C++ 修饰。

    如果需要将此函数保留为 C++ 函数,您可以使用实用程序 undname.exedumpbin.exe 输出进行后处理以获得正常的函数名称。

    Microsoft Visual Studio 提供了一个用于取消修饰 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)"
    

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多