c++ - 避免 DLL 版本控制问题

标签 c++ windows dll

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

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

EXE ----- DLL
 |         |
 DLL1      DLL2

如果 DLL1 和 DLL2 是同一个库并且 DLL2 是 DLL1 的更新版本,我将在链接和编译方面遇到麻烦。

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

最佳答案

Microsoft 为 Windows XP 解决了这个问题,但对“ native ”开发人员隐瞒了有关如何解决此问题的信息。

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

基本上你要做的是:

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

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

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

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


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

要挂接到此 DevStudio #pragma 用于注册要包含在生成的 list 中的程序集。这是一个应用程序(或 dll)如何声明它有兴趣使用 comctl32.dll 的版本的示例 - 出于您的目的,您将更改名称以反射(reflect)您的“dll”程序集名称,并且您不需要应用随附程序集的版本或 publicKeyToken 参数。

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

关于c++ - 避免 DLL 版本控制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33499136/

相关文章:

c++ - clang 3.3 和 constexpr 约束

c++ - OSG 窗口阻止 OpenCV 窗口的刷新

c# - 在 Windows 事件跟踪 (ETW) 中,TraceEventSession 无法捕获记事本中的读取事件

Windows DLL 和动态初始化排序

C++ GetProcAddress() 找不到静态类的方法

php与dll通信?

c++ - 结构变量成员后的花括号是什么意思?

c++ - SURF、FlannMatcher的min_dist和max_dist是什么意思

c++ - exp() 函数的浮点实现是否等同于截断的泰勒级数展开?

python - 如何在 Windows 上为 Python 2.4 和 2.5 版本设置 virtualenv 环境?