【问题标题】: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,一切都应该没问题。
希望这会有所帮助,
最好的祝福,
汤姆。