【发布时间】:2018-12-23 04:09:12
【问题描述】:
最近,我看到一个 C++ 程序在其动态部分 (readelf -d) 中列出了 libstdc++ 和 libc++。
我很困惑,因为一个来自 GNU,另一个来自 LLVM,它们都是 STL 的实现。那么一个程序如何将两者联系起来呢?这是什么意思?
在链接时如何解析同时提供的符号(例如std::string)?
【问题讨论】:
最近,我看到一个 C++ 程序在其动态部分 (readelf -d) 中列出了 libstdc++ 和 libc++。
我很困惑,因为一个来自 GNU,另一个来自 LLVM,它们都是 STL 的实现。那么一个程序如何将两者联系起来呢?这是什么意思?
在链接时如何解析同时提供的符号(例如std::string)?
【问题讨论】:
例如,如果程序与一个标准库实现链接,并且还与链接到另一个的静态库链接,则可能会发生这种情况。这不会引起问题,因为诸如 std::string 之类的名称会被分解成更长、更复杂且不会发生冲突的名称。 (这也是重载同名函数并使用不同参数类型调用的方式,以及为旧版本标准库编写的程序在升级时不会中断的原因。)
一个重要的警告:这仅在 STL 不是链接到不同版本的任何组件的接口的一部分时才有效。否则,任何客户端代码都将针对不同版本的标准库进行编译,而不是在调用该组件时链接到的标准库,甚至将错误的数据结构传入和传出库。
【讨论】: