我有多个 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是这方面的起点。
基本上你要做的是:
将 Dll1 和 Dll2 转换为程序集。程序集是一个 dll 文件 + 一个拥有它的 list 。称它们为 dll1.manifest 和 dll2.manifest(也许)。
向 EXE 和 DLL 添加 manifestdependency* 指令,按名称列出上述每个程序集。
为每个程序集创建子文件夹“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/