2015-11-03 101 views
1

我在C++中有多个可执行程序,它们使用C++编写的许多库(我拥有所有这些库的源代码)。避免DLL版本问题

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

EXE ----- DLL 
|   | 
DLL1  DLL2 

如果DLL1和DLL2是相同的库和DLL 2是DLL1的更新版本,我会遇到麻烦链接和编译的东西。

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

+1

个人而言,我的建议是避免整个混乱,只是重新编译您的程序到独立的可执行文件。是的,他们会占用更多的磁盘空间,但这些日子,谁在乎? –

+0

鉴于你拥有所有东西的来源 - 而不是我下面的复杂答案 - 务实的解决方案是重建包括版本号的dll。然后exe会导入并使用“dll.1.0.dll,并且dll会导入并使用'dll.2.0.dll',并且每个人都可以存在于一个文件夹中。 –

回答

2

微软为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='*'\"")