避免DLL版本问题
我在C++中有多个可执行程序,它们使用C++编写的许多库(我拥有所有这些库的源代码)。避免DLL版本问题
我面临的问题是:当一个可执行的EXE包括DLL DLL他们可能都依赖于其他DLL DLL1和DLL2:
EXE ----- DLL
| |
DLL1 DLL2
如果DLL1和DLL2是相同的库和DLL 2是DLL1的更新版本,我会遇到麻烦链接和编译的东西。
我该如何解决这个问题?有时候,我不能只是转储DLL1,并保持最新的由于向后兼容性问题。
微软为Windows XP解决了这个问题,但几乎隐藏了关于如何从“本地”开发者那里获得的信息。
有点吓人的MSDN页面Building C/C++ Isolated Applications and Side-by-side Assemblies是跳转点。
基本上你需要做的是:
转换DLL1和DLL2到组件。程序集是一个dll文件+拥有它的清单。称他们为dll1.manifest和dll2.manifest(也许)。
将manifestdependency *指令添加到EXE和DLL中,并按名称列出上述每个程序集。
为每个程序集创建子文件夹“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='*'\"")
个人而言,我的建议是避免整个混乱,只是重新编译您的程序到独立的可执行文件。是的,他们会占用更多的磁盘空间,但这些日子,谁在乎? –
鉴于你拥有所有东西的来源 - 而不是我下面的复杂答案 - 务实的解决方案是重建包括版本号的dll。然后exe会导入并使用“dll.1.0.dll,并且dll会导入并使用'dll.2.0.dll',并且每个人都可以存在于一个文件夹中。 –