微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EXE如何在DLL上有静态依赖关系?

通常当试图运行一个使用DLL的EXE时,如果DLL丢失,你会得到一个标准的Windows错误

程序无法启动,因为您的计算机中缺lessXXX.dll。 尝试重新安装程序来解决这个问题。

这似乎是内置到您的任何代码调用之前的EXE …它是如何工作的,以及如何在Visual Studio中构build项目时设置它?

编辑:

如何在Linux上编译cmake,以便它可以生成vsproj文件

dlldata.c不是在win32下生成的?

为什么在VCC 2003中编译这么长时间?

菜单项或菜单栏中显示一个

如果您需要pipe理员权限,Windows 7如何确定? (VC60)

在我的具体情况下,我实际上有一个DLL对其他DLL有“静态”依赖关系,所以如果这些DLL不存在,注册我的DLL失败,这有点难以诊断。 但我宁愿不手动列出使用的DLL函数,因为有很多!

无法获取Visual Studio C ++包含文件“excpt.h”以进行安装

改变当前的工作目录VS13?

错误C2327:不是types名称,静态或枚举器

如何将图标分配给Windows(或Visual Studio)上的可执行文件

什么是PE中的“隔离图像”属性

当你链接一个DLL有两种方法来做到这一点,隐式链接和显式链接。 你遇到的是一个隐式链接的失败。

隐式链接通过称为包含在使用PE(可执行可执行文件)格式的可执行映像中的导入表进行操作。 PE格式定义了导入和导出表。 导出表包含由DLL导出的函数列表及其入口点。 导入表包含其他模块的隐式依赖关系。

当可执行文件启动时,加载器读取导入表,然后尝试加载所有引用的DLL以及这些DLL中的所有函数。 这可能会失败,如果没有找到该DLL,如果该DLL未能正确加载,或者如果该DLL不包含引用的函数。 在你的情况下,它是失败的,因为加载程序没有找到DLL搜索路径中的XXX.dll 。

链接器将生成导入表。 在C ++中,这通常是通过该DLL的.lib文件完成的。

显式链接代码调用LoadLibrary和GetProcAddress来加载DLL及其函数的地方。 通常,当您要编写可在不同系统上运行的应用程序时,会使用此方法。 例如,您可能希望使用仅在特定版本的操作系统上存在的某些功能,但在较早版本的操作系统上运行时会降级为某些其他行为。

提到链接到DLL时,不应使用术语“ 静态” 。 静态链接是指当函数的实现包含在图像中而不是包含在外部库中时。

关于这个主题的MSDN文章解释了所有这些以及更多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐