【问题标题】:How to force VC++ name mangling C++Builder?如何强制 VC++ 名称修改 C++Builder?
【发布时间】:2011-04-18 06:16:25
【问题描述】:

是否可以从具有特定重整名称的 C++Builder DLL 导出函数?
我正在尝试构建一个 C++Builder DLL 来替换现有的 VC++ DLL。问题是使用 DLL 的应用程序希望其中一个函数具有特定的重命名。

也就是说,它期望函数被调用:

"?_FUNCTIONNAME_@@YAHPAU_PARAM1_@@PAU_PARAM2_@@@Z"

当然,我可以从我的 DLL 中导出带有重命名的函数,但 CodeGear 坚持使用自己的名称重整方案。

是否可以强制 C++Builder:

  1. 对函数使用特定的重命名?

  2. 对特定函数使用 VC++ 名称修饰?

请注意,我只想更改特定函数的修饰,而不是 DLL 中的所有函数。

【问题讨论】:

    标签: c++ export c++builder


    【解决方案1】:

    名称修改只是 ABI 的众多方面之一。事实上,标准化会更容易。编译器在使用不同的 ABI 时故意使用不同的名称修饰,以防止链接不兼容的对象。

    您可以为给定函数尝试的一件事是将其标记为extern "C",然后它将使用C 的调用约定和相同的修改(通常根本不修改或只是初始_)。显然这不会解决其他问题(异常处理、vtbls 的精确内容、用于传递参数的寄存器、标准库的精确定义……)

    【讨论】:

    • 我的理解是,使用extern "C" 将阻止函数名被破坏,我实际上希望它以某种方式被破坏。
      我 CodeGear 允许开发人员导出具有特定名称的函数,但我只能使用简单的导出名称,而不是带有修饰字符的复杂名称。我想知道是否有其他人能够让这个工作。
    • +1,修改是为了保护您免受不兼容的 ABI 的影响。你应该首先弄清楚你的目标是哪个 VC++ ABI,IIRC VC-pre-2005 ABI 与 VC2005 及更高版本的 ABI 不兼容。
    【解决方案2】:

    使用.def 文件为导出的函数指定您自己的命名。

    【讨论】:

    • 谢谢雷米。不幸的是,这似乎只适用于简单的名称。当我尝试对一个长的、损坏的函数名执行此操作时,链接器抛出了一个错误。 +1 因为是唯一一个真正尝试回答我提出的问题的人。
    猜你喜欢
    • 2015-03-24
    • 2011-06-07
    • 1970-01-01
    • 2010-10-28
    • 2016-06-20
    • 2023-01-02
    • 2017-05-22
    • 2012-11-03
    • 2021-04-11
    相关资源
    最近更新 更多