C++ 标准对动态库有何规定?

问题描述 投票:0回答:1

C++ 标准对动态库有何规定?我听说它完全忽略了它们(出于某种原因) - 如果这是真的,为什么会这样?

c++ dynamic-linking dynamic-library
1个回答
0
投票

动态库实际上只有 2 个主要陷阱,您可以轻易地打破 C++ 标准中所做的假设,使其与抽象机

不匹配
  • 违反“单一定义”规则,例如您已成功地动态链接两个具有同一符号的不同实现的库,由于某种原因,每个库都有首选的 local 链接,并且根据谁调用,使用不同的实现。 C++ 规范仍然告诉您可以做什么,即使编译器、链接器和动态加载器可以轻松配置为违反它。

    在这种情况下,您的默认值例如在 ld-linux + gcc + ld 的 Linux 系统上,all符号具有公共可见性,意味着all符号在运行时由动态加载器解析,这实际上符合抽象机的描述。

    尽管出于性能原因,此默认值根本不可取,但限制符号的可见性是有充分理由的。

  • 在意外的时间加载和卸载库。这意味着指针(指向代码和数据段)可以在任意时间变得无效(或仍然无效),这与抽象状态机根本不匹配。

在这两种情况下,作为开发人员,您仍然有责任确保您处于抽象机器的范围内,并且不会导致任何与其相矛盾的可观察行为。

理论就这么多。

现实情况是,在这两种情况下,大多数动态库实际上甚至不尝试表现得好像系统/进程作为一个整体与 C++ 抽象机兼容。

相反,C++ 只期望在每个动态库中功能齐全,而整个外部接口完全了解动态链接、符号可见性等,并避免任何可能在边界上暴露未定义行为的 C++ 功能。每个库的行为都遵循抽象机。

© www.soinside.com 2019 - 2024. All rights reserved.