“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 不支持正确的动态链接”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
“内容”是啥意思:在招摇/openapi“响应”中是啥意思: