首页 > 解决方案 > 为什么 boost lib 有外部链接,而不是内部链接?(仅标题链接的最佳实践)

问题描述

Boost 库将函数定义为以下样式

namespace boost::io::detail {
    template<class Iter, class Facet>
    Iter wrap_scan_notdigit(...) {
        // snip
    }
}

据我了解,该功能具有外部联系,因为

根据我的经验,标头上的外部链接通常会导致 ODR 违规。例如,两个不同的翻译单元可能包含不同的版本;当您使用 3rd-party 时,通常会发生这种情况。所以.a(静态)库。

ODR 违规的关键问题是 NDR:编译器/链接器不必发出错误,但在极少数情况下它可能会生成执行时错误。

内部联动可以避免这个问题。

所以我的问题是(与标题相同):

标签: c++boostlinkage

解决方案


标头上的外部链接通常会导致 ODR 违规。

仅当标头写得不好时(或者如果定义依赖于预处理器指令,则可能在使用不当时)。

外部链接减少了代码膨胀,因为每个程序只需要每个函数的一个副本,而不是每个翻译单元一个副本。

当您使用 3rd-party .so 库时,通常会发生这种情况。

库对象代码不应从仅标头库中导出符号。仅标头的要点是它无需链接到库对象代码即可使用。


推荐阅读