程序对 libstdc++ 和 libc++ link 意味着什么?
What does it mean for a program to link to both libstdc++ and libc++?
最近,我看到一个 C++ 程序在其动态部分 (readelf -d
) 中同时列出了 libstdc++ 和 libc++。
我很困惑,因为一个来自 GNU,另一个来自 LLVM,它们都是 STL 的实现。那么一个程序怎么才能link兼得呢?这是什么意思?
当 linking?
时,它如何解析两者提供的符号(例如 std::string
)
例如,如果程序与一个标准库实现链接,并且还与链接到另一个的静态库链接,则可能会发生这种情况。这不会引起问题,因为 std::string
之类的名称被破坏成更长更复杂的名称,不会发生冲突。 (这也是同名函数可以重载和调用不同参数类型的原因,也是为旧版本标准库编写的程序在升级时不会中断的原因。)
一个重要的警告:只有当 STL 不是链接到不同版本的任何组件的接口的一部分时,这才有效。否则,任何客户端代码都将针对不同版本的标准库进行编译,而不是它在调用该组件时链接到的标准库,甚至会将错误的数据结构传入和传出库。
最近,我看到一个 C++ 程序在其动态部分 (readelf -d
) 中同时列出了 libstdc++ 和 libc++。
我很困惑,因为一个来自 GNU,另一个来自 LLVM,它们都是 STL 的实现。那么一个程序怎么才能link兼得呢?这是什么意思?
当 linking?
时,它如何解析两者提供的符号(例如std::string
)
例如,如果程序与一个标准库实现链接,并且还与链接到另一个的静态库链接,则可能会发生这种情况。这不会引起问题,因为 std::string
之类的名称被破坏成更长更复杂的名称,不会发生冲突。 (这也是同名函数可以重载和调用不同参数类型的原因,也是为旧版本标准库编写的程序在升级时不会中断的原因。)
一个重要的警告:只有当 STL 不是链接到不同版本的任何组件的接口的一部分时,这才有效。否则,任何客户端代码都将针对不同版本的标准库进行编译,而不是它在调用该组件时链接到的标准库,甚至会将错误的数据结构传入和传出库。