【问题标题】:Lib and DLL linking to an exe error "cannot read at 0x300"Lib 和 DLL 链接到 exe 错误“无法在 0x300 读取”
【发布时间】:2012-01-25 20:07:37
【问题描述】:

我有一个关于如何使用 .dll/.libs 的一般性问题。我正在创建一个用于我的项目的 .dll,但是,我注意到当我去编译时,我需要静态链接与 .dll 关联的 .lib 以供项目编译(否则会出现链接错误“致命错误 LNK1107:无效或损坏的文件:无法读取 0x300")。所以以后当我重新分发我的项目,然后在将来更新它时,我是否需要发布一个新的 .exe 和一个新的 .dll 而不仅仅是一个新的 .dll?如果是这样,那为什么还要使用 .dll 呢?

【问题讨论】:

    标签: c++ visual-studio deployment dll


    【解决方案1】:

    .lib 包含由 DLL 导出的函数等的存根。您将 .lib 链接到您的 EXE 中,现在您的 EXE 知道如何调用这些函数。但是当然那里没有任何功能 - 呼叫无处可去。在加载时,当操作系统加载你的 EXE 时,它也会加载你的 DLL,然后它修补 EXE - EXE 调用存根的地方,加载器用调用 DLL 中的实际函数来替换它。

    通常您不需要将 .lib 发送给您的客户。但是,如果您的客户想要编写他们自己的使用您的 DLL 的 EXE,那么您需要将 .lib 发送给他们,以便他们可以链接他们的 EXE。

    链接器错误 LNK1107 表示您试图链接到 DLL 而不是 .lib。这总是错误的,因为根据定义,DLL 是在运行时动态链接的,而不是在构建时静态链接的。

    【讨论】:

    • 我正在尝试您的建议。我的问题是,当我在调试模式下构建时,没有生成 lib 文件。仅生成 dll 文件。如何在调试版本中生成 lib 文件。
    • 您的评论似乎表明您在发布版本中获得了一个 lib 文件,但在调试版本中没有。那正确吗?如果是这样,请确保您在两个版本中设置了相同的链接器选项(当然,那些需要在发布和调试之间有所不同的选项除外。)
    • 如果您的 DLL 包含任何具有 __declspec(dllexport) 属性的函数,或者如果您使用 DEF 文件显式导出函数,链接器通常会自动生成导入库。也许您的 __declspec(dllexport) 被编译器排除在外,因为它被 #ifndef(_DEBUG) 或类似的东西包围了?
    • 啊……可能是这样。实际上我根本没有使用 __declspec(dllexport) 属性。这是因为我正在导出类。
    • 啊,我明白了。在 DLL 的上下文中,这不是“导出”。基本上,从 DLL 导出函数意味着将其地址发布到导出表中,以便客户端可以在加载时找到它并链接到它。要导出函数,请使用 __declspec(dllexport) 属性。这将导致链接器在 DLL 的导出表中列出您的函数,并为您创建导入库。同样的原则也适用于导出类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多