【问题标题】:Statically linked application - invalid or corrupt dll静态链接的应用程序 - 无效或损坏的 dll
【发布时间】:2011-01-11 20:40:25
【问题描述】:

我有一个使用 winInet 类的应用程序 - #include <afxinet.h>wininet.dll

我想静态链接我的应用程序中的 WinInet 函数调用以及 dll,所以我关注了these steps。然后,当我阅读here 时,我将 wininet.dll 复制到我的项目目录中。

在构建时出现以下错误 - wininet.dll : fatal error LNK1136: invalid or corrupt file

我的第一个问题是:
- 我正确地做我认为静态链接函数调用和 dll 的事情吗?
- 如果是这样,为什么这个设置会损坏 dll,但没有这些更改就可以工作?

感谢任何帮助。谢谢。

【问题讨论】:

    标签: windows visual-studio winapi dll compiler-construction


    【解决方案1】:

    “静态链接”是将代码包含在应用程序中的过程。从本质上讲,DLL 是一个动态链接库,因此不,包括应用程序目录中的 DLL 不是静态链接 - 它仍然是动态的。之所以把它放在应用程序的目录下,是为了让应用程序不用安装就能找到它。

    我不认为是“损坏”的 DLL - 我怀疑您正试图将 DLL 静态链接到应用程序中,这是不可能发生的。相反,您需要在要链接的其他库中包含正确的 .lib 文件,并确保您链接的 lib 文件不是 wininet.dll 的 DLL 导出包

    【讨论】:

      【解决方案2】:

      您不应该直接链接到 DLL。相反,链接到相应的导入库(应该是Wininet.lib)。当然,您的应用程序仍然需要在运行时访问 DLL。链接器需要 .lib 文件来设置与 DLL 的正确链接。

      我是否正确地做我认为静态链接函数调用和 dll 的事情?

      您所做的通常称为动态链接(或多或少是动态的..),但它(afaik)是 Windows 系统 API 的唯一途径。 “静态”链接将 Wininet 代码直接嵌入到您的可执行文件中,无需外部 DLL。

      【讨论】:

        【解决方案3】:

        当您与 DLL 链接时,有一个相应的 LIB 文件可用于设置与函数的正确链接。例如,如果您使用的是 USER32.DLL 和 KERNEL32.DLL,则需要链接的相应 LIB 将是 USER32.LIB 和 KERNEL32.LIB。

        有时它不是那么明显,您可以通过查看 MSDN 来仔细检查有问题的功能,当您向下滚动到该页面的底部时,它会告诉您要链接的库,例如,看在 Win32API 的 CreateProcess,当您查看页面底部时,它会告诉您要使用的库是什么,在本例中是 KERNEL32.LIB。

        您刚刚在链接器阶段引用了一个 DLL,链接器无法理解该 DLL,因为它已经是一个编译库,因此链接器抱怨它“已损坏”。

        将其更改为 WinInet.LIB,一切都应该没问题。

        希望这会有所帮助, 最好的祝福, 汤姆。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多