【问题标题】:DLL dependencies and allowing one to failDLL 依赖项并允许一个失败
【发布时间】:2017-01-07 03:06:45
【问题描述】:

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

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

如果我在这里错了,请纠正我(在这种情况下,我将使用细齿梳检查代码,以确保没有执行任何 OpenCL 调用)。

我不确定 Visual Studio(或依赖项分析程序?)如何确定哪些 DLL 是给定 DLL 的依赖项。但是我不想要 OpenCL.dll 依赖项。

我有什么选择?

一种可能的方法是使用 OpenCL 代码获取项目并进行重构,以便可以在构建中排除 OpenCL 部分的情况下构建其中的某些部分。然而,这将是相当大的工作量,所以我真的希望能做一些更简单的事情。

【问题讨论】:

    标签: visual-studio dll dependencies


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这个选项一直在链接器/输入设置中。我应得的反对票。非常感谢您的回答。
    • 我不同意反对票。 问题 是有效的、记录在案的并且问得很好。你不应该因为不知道答案而被否决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2018-10-15
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多