“Windows 不支持正确的动态链接”是啥意思?

Posted

技术标签:

【中文标题】“Windows 不支持正确的动态链接”是啥意思?【英文标题】:What is meant by "Windows doesn't support proper dynamic linking?"“Windows 不支持正确的动态链接”是什么意思? 【发布时间】:2017-02-02 07:40:22 【问题描述】:

我已阅读有关 Linux 调用 dlopen()dlsym() 的文档,它们分别打开动态库并在库中加载符号。

这些调用似乎等同于 Windows 的 LoadLibrary()GetProcAddress()

我在这篇文章中读到“Windows 不支持正确的动态链接”:Running LLVM passes on Windows 10 gives no output in terminal?。

Linux 和 Windows 动态库调用不同的原因是什么?

Linux 上的动态库可以在可执行文件中加载符号的唯一区别是什么?但这意味着可执行文件也是 Linux 上的库,因为 dlopen() 在动态库上运行。

【问题讨论】:

【参考方案1】:

Windows确实支持正确的动态链接。不同之处在于 Windows 不支持 improper 动态链接,您可以将可执行文件链接到库(即错误的方式)。这个错误在 Windows 上是不可能的,因为它的可执行文件没有导出表。

也就是说,你的逻辑有点缺陷。即使在 Windows 上,可执行文件和动态库也没有太大区别。 LoadLibrary 实际上会加载可执行文件; GetProcAdddress 失败了。

至于插件逻辑,使用抽象(纯虚拟)类作为接口在 C++ 中很容易安排。

【讨论】:

你知道为什么 Windows 选择不为其可执行文件提供导出表吗? 你能链接它显示插件是如何用 C++ 制作的吗? 我猜你的意思是“你将一个库链接到一个可执行文件的地方”。 @Shuzheng:这是正确的方法。我明确地谈论了错误的方式,即您尝试将可执行文件与库链接。至于为什么Windows“选择”不拥有它,这表明默认是拥有这样一个表。但是这样的表只有在链接器创建它时才存在,并且是一个有意识的决定。所以正确的问题是为什么 Linux 和 UNIX 链接器选择创建导出表。 但是您可以使用从库 dll 中的可执行文件导出的函数。这些函数必须被dllexport'ed,然后只需创建一个导出库并在链接库dll时使用它。并且可执行文件必须是使用 dll 的那个。

以上是关于“Windows 不支持正确的动态链接”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

“this”这个词是啥意思,“static”是啥意思?

“||”是啥意思在 var 语句中是啥意思? [复制]

PPPoE是啥意思,PPPoE是啥意思

“内容”是啥意思:在招摇/openapi“响应”中是啥意思:

TypeScript 这个语法“-?”是啥意思? (破折号问题)是啥意思?

“?”是啥意思?调用jsp时标记是啥意思? [复制]