DLL 依赖项版本冲突
Dll dependency version conflict
我正在将C++与Visual Studio 2008 Express一起使用。
我们正在向客户端提供仅二进制的 Windows 库,该库本身使用许多其他库。因此,我们同时发布了我们的 dll 文件以及我们使用的 dll 文件。现在的问题是我们的客户使用了一些我们也使用的库,但在另一个版本中。因此,他不能使用我们的库,因为我们都依赖的库是不兼容的。
从技术上讲,我认为应该可以将两个依赖项版本加载到进程空间中。但是,我不确定如何执行此操作,因为它们的应用程序以及我们的 dll 都在寻找相同的依赖项 dll 文件名。谁能告诉我处理这个问题的最佳/最干净的方法是什么?
谢谢!
一般来说,它不起作用。这是因为第三方 DLL 版本在加载到内存中时可能会相互干扰。一个例子是,如果存在独占资源,例如特定目录中的文件。或特定设备。问题是,没有人知道甚至可能不知道第三方DLL的制造商 - 因此需要进行广泛的测试。
但也许你很幸运,无论如何它都有效。我的食谱:
- 将您的 DLL "DTAG.DLL" 和所有需要的 DLL 放在应用程序目录的子目录中,并具有固定名称,例如 "DTAG_LIB"。
- 手动编写导入库(使用 DELAYLOAD 还有其他可能性)。在该库中,使用 LoadLibraryEx 加载您的 DLL。提供以"DTAG_LIB\DTAG.DLL"结尾的绝对路径和标志LOAD_WITH_ALTERED_SEARCH_PATH。然后,Windows将从此目录中加载DTAG.DLL,并从该目录中加载所有需要的DLL。不要将 PATH 设置为"DTAG_LIB"!
- 您的客户必须链接到您的手动导入库。
您可以使用将交付的(新的)附加 DLL 来解决此类问题,该 DLL 将负责处理版本冲突(在运行时) - 作为您的应用程序与其依赖项之间的一种代理。
另一种方法是使用 Windows 转发库机制。
转发器是适应从一个 DLL 移动到另一个 DLL 的功能的便捷方法
您可以使用多种方法来声明转发器,例如模块定义 (.def
) 文件和#pragma
:
#pragma comment(linker, "/export:function=otherdll.function")
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 写入位置0x0000000C时发生访问冲突
- 导入库可以跨dll版本工作吗
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 不同的Visual Studio版本中缺少.dll
- 链表中写入访问冲突的未知原因
- 这个SSDO演示的GLSL版本要求是自我冲突的吗
- Protobuf版本与Qt冲突
- 如果使用低于 VS2015 的 vc++ 编译器版本编译,则 DLL 中的访问冲突
- 两个提升版本之间的冲突
- 在避免代码重复和冲突名称的同时,如何实现多个版本的同一算法
- 使用Opencv和Tensorflow c++时发生Protobuf版本冲突
- 最新版本的提升和提升几何库 (GGL) 之间的冲突
- DLL 依赖项版本冲突