我在C ++中有多个可执行程序,它们使用了许多用C ++编写的库(我有所有这些库的源代码)。
我面临的问题是:当可执行EXE包含DLL DLL时,它们可能都依赖于其他dll DLL1和DLL2:
EXE ----- DLL
| |
DLL1 DLL2
如果DLL1和DLL2 相同的库且DLL2是DLL1的更新版本,我将无法链接和编译内容。
我该如何解决这个问题?有时候,由于向后兼容性问题,我无法转储DLL1并保持最新状态。
答案 0 :(得分:2)
微软解决了Windows XP的这个问题,但几乎隐瞒了如何从" native"开发者。
有点令人生畏的MSDN页面Building C/C++ Isolated Applications and Side-by-side Assemblies是对此的跳跃点。
基本上你要做的是:
将Dll1和Dll2转换为程序集。程序集是一个dll文件+拥有它的清单。称他们为dll1.manifest和dll2.manifest(也许)。
向EXE和DLL添加manifestdependency *指令,按名称列出上述每个程序集。
创建子文件夹" dll1"和" dll2"对于每个组件并在其中存储名称为dll的dll。
注意:" dll"和" exe"不要,他们自己需要成为集会,虽然文件可能推断/鼓励。
关于步骤2 - 没有必要手动添加或合并exe或dll的清单文件,因为Visual Studio的现代版本会自动包含生成的应用程序清单。有一个专门用于此的整个项目设置选项卡。
要挂钩这个,DevStudio #pragma用于注册要包含在生成的清单中的程序集。这是一个应用程序(或dll)如何声明其对使用版本化的comctl32.dll感兴趣的示例 - 为了您的目的,您将更改名称以反映您的" dll"程序集名称,您不需要为应用程序附带的程序集使用version或publicKeyToken参数。
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")