【问题标题】:Do I need to distribute a header file and a lib file with a DLL?我是否需要使用 DLL 分发头文件和 lib 文件?
【发布时间】:2016-09-13 22:48:02
【问题描述】:

我正在为客户更新 DLL,并且由于公司政治 - 除其他外 - 我的公司已决定不再与客户共享源代码。

以前。我假设他们拥有所有源代码并将其作为 VC++6 项目导入。现在他们必须链接到预编译的 DLL。我想,至少,我需要将*.lib 文件与 DLL 一起分发,以便可以定义 DLL 入口点。但是,我是否也需要分发头文件?

如果我可以侥幸不分发它,客户将如何将 DLL 导入他们的代码?

【问题讨论】:

  • 如果没有头文件,你将如何创建某事物的实例并在其上调用方法?您将遇到编译时错误,因为一切都未定义。
  • @Ceros:这是一个答案
  • 为什么你们公司更早“分享源代码”??

标签: c++ visual-c++ dll shared-libraries


【解决方案1】:

但是,我还需要分发头文件吗?

是的。否则,您的客户将不得不自己手动声明函数,然后才能使用它。可以想象,这将非常容易出错并且是调试的噩梦。

【讨论】:

    【解决方案2】:

    是的,您需要将标头与您的 .lib 和 .dll 一起分发

    为什么?

    至少有两个原因:

    • 因为 C++ 需要知道库中函数的返回类型和参数(粗略地说,大多数编译器使用name mangling,将 C++ 函数签名映射到库入口点)。
    • 因为如果您的库使用类,C++ 编译器需要知道它们的布局才能在您的库客户端中生成代码(例如,为了传递参数而将多少字节放入堆栈)。

    附加说明:如果您之所以问这个问题是因为您想从标题中隐藏实现细节,您可以考虑pimpl idiom。但这需要对您的代码进行一些重构,并且还可能在性能方面产生一些后果,因此请仔细考虑

    【讨论】:

    • 名称修改并不是特别相关。您需要 C 标头的原因与您需要 C++ 标头的原因完全相同,即使在其 C ABI 没有实质上“破坏”C 符号(即不是 VS)的平台上也是如此。在这两种情况下,您可以在您自己的代码中重新声明所有库符号,但必须有人告诉您这些符号是什么,哪个...嗯,这是一个标题!
    【解决方案3】:

    除了其他人对头文件/ LIB 文件的解释之外,这里是不同的视角。

    无论如何,客户都可以使用 Dependency Walker 等基本工具对 DLL 进行逆向工程,以了解您的 DLL 正在使用哪些系统 DLL、您的 DLL 正在使用哪些函数(例如 AdvApi32.DLL 中的某些函数)。

    如果您希望您的 DLL 被隐藏,您的 DLL 必须:

    • 动态加载所有自定义 DLL(如果不可能,无论如何做下一步)
    • 在您要调用的所有函数上调用 GetProcAddress(例如,GetProcessToken 来自 ADVAPI32.DLL

    这样,至少依赖遍历器(没有跟踪)将无法找到正在使用的函数(或 DLL)。您可以按序号而不是按名称加载系统DLL的功能,因此在DLL中通过文本搜索进行逆向工程变得更加困难。

    调试器仍然能够调试您的 DLL(以及其他工具)并对其进行逆向工程。您需要找到防止调试 DLL 的技术。例如,非常基本的 API 是 IsDebuggerPresent。还可以使用其他高级方法。

    我为什么要说这一切?好吧,如果您打算提供标头/DLL,客户仍然可以找到导出的函数并使用它。作为 DLL 提供者,您还必须为其提供编程元素。如果一定要隐藏,那就彻底隐藏吧。

    【讨论】:

      【解决方案4】:

      您可以使用的另一种方法是仅传递 DLL 并让客户使用 LoadLibrary() + GetProcAddress() 动态加载它。虽然您仍然需要让您的客户知道 DLL 中函数的签名。

      这里有更详细的示例:

      Dynamically load a function from a DLL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 2018-11-28
        • 2013-02-22
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多