【问题标题】:Statically linking a DLL in Windows在 Windows 中静态链接 DLL
【发布时间】:2010-12-02 05:15:01
【问题描述】:

考虑这种情况:

我正在创建一个 DLL(我们称之为 dllA),它依次调用其他 DLL 中的函数(我们称之为 dllX、dllY 和 dllZ)。如果其他人想使用 dllA,他们还需要 dllX、Y 和 Z 的副本。

有没有办法构建 dllA 使 dllX、Y 和 Z 中所需的函数链接到 dllA?我不知道这是否是正确的术语,但这是否称为“静态链接 DLL”?

我正在寻找一个简单的解决方案。如果存在这样的东西,我会对简单地连接 dllX、Y 和 Z 并以某种方式将其附加到 dllA 的粗略的东西感到满意。 但我有一种不好的感觉,没有简单的解决方案。

我在 Windows 上,使用 VS。

谢谢!

【问题讨论】:

  • 你有所有dll的源代码吗?

标签: dll static linker


【解决方案1】:

您不能静态链接 DLL,只能链接 LIB。 DLL 是自包含的,具有静态成员和 DllMain 加载/卸载依赖项,这意味着它们不能拆分为包含函数并链接到不同的可执行文件。

您应该根据需要创建一个部署所有适当 dll 的安装程序。

如果您真的认为这很重要并且您不能依赖您的应用安装程序,您可以创建一个包装器,将所需的 dll(A、X、Y 和 Z)作为资源嵌入,并在运行时提取它们并将它们写入磁盘用户配置文件临时文件夹,然后加载提取的 dllA 并将所有传入函数调用推迟到加载的 dllA。一些 sysinternals 工具使用类似的技术从 x86 映像中提取应用程序的 x64 映像,并将自身重新启动为 64 位进程,而无需发送两个单独的 exe。

【讨论】:

  • 我喜欢将 DLL 提取到临时文件夹中的这个想法......关于如何做到这一点的任何示例/教程?
【解决方案2】:

从技术上讲,您不能静态链接 DLL,但 'Implicit linking' 等价于它。

  1. 在可执行文件中包含使用 __declspec(dllimport) 说明符的头文件声明。
  2. 与 dll 同名的 .lib 与 DLL 在构建时一起生成,称为“导入库”。将此库链接到可执行文件。
  3. 将 dll 放在 exe 旁边。

然后,只要调用 exe,windows 就会加载 DLL,有效地充当静态库。

【讨论】:

    【解决方案3】:

    我不相信你可以。我还没有听说它正在完成。如果您对其他 DLL 具有构建访问权限,那么您可以将它们构建为静态库,这将按您的意愿工作,但它们被称为 动态 链接库是有原因的。

    编辑:刚刚找到this thread

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多