【问题标题】:Avoiding DLL versioning problems避免 DLL 版本控制问题
【发布时间】:2015-11-03 12:26:11
【问题描述】:

我有多个 C++ 可执行程序,它们使用许多也用 C++ 编写的库(我有所有这些库的源代码)。

我面临的问题是:当可执行 EXE 包含一个 dll DLL 时,它们可能都依赖于其他 dll DLL1 和 DLL2:

EXE ----- DLL
 |         |
 DLL1      DLL2

如果 DLL1 和 DLL2 是同一个库,而 DLL2 是 DLL1 的更新版本,我将无法链接和编译内容。

我该如何解决这个问题?由于向后兼容性问题,有时我不能只转储 DLL1 并保持最新。

【问题讨论】:

  • 就个人而言,我的建议是避免整个混乱,只需将您的程序重新编译成独立的可执行文件。是的,它们会占用更多的磁盘空间,但是这些天,谁在乎呢?
  • 鉴于您拥有所有内容的来源 - 而不是我在下面的复杂答案 - 实用的解决方案是重建包含版本号的 dll。然后exe会导入并使用“dll.1.0.dll”,而dll会导入使用“dll.2.0.dll”,每个人都可以存在于一个文件夹中。

标签: c++ windows dll


【解决方案1】:

微软为 Windows XP 解决了这个问题,但几乎向“本地”开发人员隐瞒了有关如何做到这一点的信息。

有点吓人的 MSDN 页面Building C/C++ Isolated Applications and Side-by-side Assemblies 是指向此的起点。

基本上你要做的是:

  1. 将 Dll1 和 Dll2 转换为程序集。程序集是一个 dll 文件 + 一个拥有它的清单。称它们为 dll1.manifest 和 dll2.manifest(也许)。

  2. 将 manifestdependency* 指令添加到按名称列出上述每个程序集的 EXE 和 DLL。

  3. 为每个程序集创建子文件夹“dll1”和“dll2”,并在其中存储同名的dll。

注意:“dll”和“exe”不需要,它们本身需要是程序集,尽管文档可能会推断/鼓励这样做。


关于第 2 步 - 无需手动添加或合并 exe 或 dll 的清单文件,因为现代版本的 Visual Studio 会自动将生成的清单包含在应用程序中。有一个专门用于此的整个项目设置选项卡。

DevStudio #pragma 用于注册要包含在生成的清单中的程序集。这是一个应用程序(或 dll)如何声明其对使用 comctl32.dll 版本的兴趣的示例 - 出于您的目的,您将更改名称以反映您的“dll”程序集名称,并且您不需要应用程序附带的程序集的版本或 publicKeyToken 参数。

#pragma comment(linker,"\"/manifestdependency:type='win32' \
  name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
  processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多