DLL依赖关系并允许一个失败

时间:2016-08-30 17:56:30

标签: visual-studio dll dependencies

我目前正在研究项目正在生成DLL的问题。现在它建立在一系列其他项目的基础上,这些项目都是C ++,所以它们只是链接的.lib文件。

在这种情况下,一个项目使用OpenCL,但我不相信正在运行这些代码路径。但是出现只是将OpenCL链接在一起导致输出.DLL依赖于OpenCL.dll。

如果我在这里错了,请纠正我(在这种情况下,我会用精细的梳子检查代码,以确保没有执行OpenCL调用)。

我不确定Visual Studio(或依赖walker?)如何确定哪个DLL是给定DLL的依赖项。但是我不想要OpenCL.dll依赖。

我有什么选择?

一种可能的方法是使用OpenCL代码获取项目并重构,以便可以使用从构建中排除的OpenCL部分构建其中的一部分。然而,这将是一个相当大的工作,所以我真的希望更简单。

1 个答案:

答案 0 :(得分:1)

如果您链接lib,则依赖于dll。最简单的方法是为此dll添加/DELAYLOAD

  

/ DELAYLOAD选项导致dllname指定的DLL仅在程序第一次调用该DLL中的函数时加载。

这会生成一个“软”依赖项,只有在调用实际需要DLL的函数时才会启动它。请务必阅读Constraints of Delay Loading DLLs

另一个选项(我不推荐)是通过LoadModuleGetProcAddress使用运行时绑定,然后通过指向函数的指针调用函数。这将删除任何依赖项,但您的任务是实现所有检查,如果DLL丢失则所有错误,如果您不匹配函数签名/调用约定,它很容易误入歧途。最终,您将手动实施/DELOAYLOAD