【问题标题】:How to update a C++ dll without needing to relink the exe with the lib file?如何更新 C++ dll 而无需将 exe 与 lib 文件重新链接?
【发布时间】:2009-07-30 17:12:53
【问题描述】:

首先,我指的是Windows环境和VC++编译器。

我想要做的是重建 Vc++ dll 并保持与已链接到 lib 的 exe 的兼容性,而无需重建 exe 或使用 LoadLibrary 动态加载 dll。换句话说,有没有办法将类和方法添加到 dll(但不删除任何)并确保现有入口点保持不变?

【问题讨论】:

    标签: dll visual-c++


    【解决方案1】:

    如果您使用 DEF 文件导出函数并手动指定序数,您应该能够完成此操作。

    参考

    http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx

    【讨论】:

    【解决方案2】:

    这取决于您的 EXE 如何使用 DLL 中的类。添加新类不应影响现有入口点。然而,除此之外,以下任何内容都会影响对象大小和/或布局,因此将是一个破坏客户端的更改(请注意,这在技术上是特定于 VC 的,但其中大部分适用于任何理智的实现):

    • 从类中删除字段(甚至是私有的)
    • 向类添加新字段(甚至是私有字段)
    • 向现有类添加新的基类
    • 从现有类中删除基类
    • 在现有的虚拟方法之前添加新的虚拟方法(在现有的虚拟方法之后添加新的虚拟方法是可以的,除了下一点描述的情况)
    • 在一个类中添加一个新的虚拟方法,该类被同一个 DLL 中的另一个类用作基类,该 DLL 也具有虚拟方法
    • 更改现有字段的类型
    • 更改现有方法的签名
    • 使虚拟方法成为非虚拟方法,反之亦然

    【讨论】:

    • 我认为这是一个很好的答案,但我会改变一件事:以任何方式更改类中的虚拟方法都是值得怀疑的。我认为您不能指望 vtable 具有与源文件中显示的相同顺序的虚函数。
    • 至少在 VC 中,您可以依靠它——这是 COM 支持的先决条件(需要明确的 vtable 排序)。
    • 很好的答案 Pavel,我只是想知道您是否可以添加一些参考来支持您的断言。谢谢!
    • @David,知识主要来自 1) 对典型实现技术(vtables 等)的理解,以及 2) 经验。这里的主要来源是特定编译器的 ABI 规范。查看二手资料,KDE 文档有一个类似于我的列表:techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++ - 通常搜索“C++ 二进制兼容性”应该会给出更多相关的点击。
    【解决方案3】:

    只要不添加任何导出的符号,序号就不会改变。如果您通过标准的 dllexport 机制添加导出的符号,那么这将很难控制。如果您使用旧样式的 .xpf 符号文件,您可能能够控制 lib 中符号的顺序(尽管我不确定这一点 - 它可能仍会重新排序它们,但是它喜欢),但这很棘手以这种方式使用 C++ 符号。

    【讨论】:

      【解决方案4】:

      我认为序号不再用于解析 DLL 导入 - 我认为您必须使用 .def 文件才能让链接器使用它们。因此,只要您不更改导出函数的名称或签名,.exe 应该可以正常工作。

      【讨论】:

        猜你喜欢
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多