我目前正在研究项目正在生成DLL的问题。现在它建立在一系列其他项目的基础上,这些项目都是C ++,所以它们只是链接的.lib文件。
在这种情况下,一个项目使用OpenCL,但我不相信正在运行这些代码路径。但是出现只是将OpenCL链接在一起导致输出.DLL依赖于OpenCL.dll。
如果我在这里错了,请纠正我(在这种情况下,我会用精细的梳子检查代码,以确保没有执行OpenCL调用)。
我不确定Visual Studio(或依赖walker?)如何确定哪个DLL是给定DLL的依赖项。但是我不想要OpenCL.dll依赖。
我有什么选择?
一种可能的方法是使用OpenCL代码获取项目并重构,以便可以使用从构建中排除的OpenCL部分构建其中的一部分。然而,这将是一个相当大的工作,所以我真的希望更简单。
答案 0 :(得分:1)
如果您链接lib
,则依赖于dll
。最简单的方法是为此dll
添加/DELAYLOAD
:
/ DELAYLOAD选项导致dllname指定的DLL仅在程序第一次调用该DLL中的函数时加载。
这会生成一个“软”依赖项,只有在调用实际需要DLL的函数时才会启动它。请务必阅读Constraints of Delay Loading DLLs。
另一个选项(我不推荐)是通过LoadModule
和GetProcAddress
使用运行时绑定,然后通过指向函数的指针调用函数。这将删除任何依赖项,但您的任务是实现所有检查,如果DLL丢失则所有错误,如果您不匹配函数签名/调用约定,它很容易误入歧途。最终,您将手动实施/DELOAYLOAD
。