gpt4 book ai didi

linux - 共享库 : Windows vs Linux method

转载 作者:IT王子 更新时间:2023-10-29 00:17:12 24 4
gpt4 key购买 nike

我有一个关于 Windows 共享库 (DLL) 与 Linux 共享库 (SO) 的快速问题。

为什么当您创建一个 Windows DLL 时,它要求客户端程序也链接到一个静态库(.lib 文件),但在 Linux 中创建的应用程序不需要链接到这样的静态库。

和代码重定位之类的有关系吗?谢谢。

最佳答案

Why is it that when you create a Windows DLL it requires the client program to also link against a static library (.lib file), but applications created in Linux does not require any linking against such static library.

这是 Microsoft 做出的一项历史性设计决策,因此链接器可以将 DLL 引用添加到可执行文件中,而无需在链接时出现特定版本的 DLL。这样做的原因是,始终存在不同版本的 Windows,以及不同版本的 DLL。也是在那时,Microsoft 正在与 IBM 在 OS/2 上进行合作,计划是 Windows 程序也可以在 OS/2 上执行。好吧,微软决定通过推出他们自己的基于 NT 内核的专业级操作系统来“背刺”OS/2。但这意味着,对于开发,您希望开发人员能够链接到系统 DLL,而无需使用 DLL 的所有不同变体。相反,动态链接"template"将用于创建 DLL 和可执行文件(均为 PE 格式),它们是这些特定的 .lib 文件,根本不是库,但仅仅是符号和序数表(这是一个鲜为人知的事实,但 PE 二进制符号不仅可以通过字符串标识符加载,还可以通过整数加载,即所谓的序数)。

序号的一个副作用是,它们允许隐藏人类可读的符号,这样只有当您知道序号 ←→ 函数关系时才能使用 DLL。

在 Unix 中,传统是,“您在要运行它的系统上构建它”,或者“您拥有所有目标系统文件”。因此,从来没有将图书馆和链接信息分开的动机。从技术上讲,这同样适用于 DLL。 PE 可以导出符号和重定位表,DLL 可以这样做,链接器可以从中获取它需要的所有信息,这很好。

如果你想用 Unix 共享对象隐藏符号,你通常会使用一个包含所有函数指针的 struct 来实现,并且只导出这个结构的全局常量实例按名称,其中包含许多未明确命名的指针。不过,您可以对 Windows DLL 执行完全相同的操作。

TL;DR:这不是技术原因,而是营销和分销决策。

关于linux - 共享库 : Windows vs Linux method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com