切换到C++ 11时,是否需要重新编译在接口中使用STL的所有依赖库?

mr4*_*r49 7 c++ stl c++11

我正在尝试将大型项目切换为使用C++ 11.我遇到了大量的链接器错误,这些错误似乎是由使用C++ 11编译的库和使用C++ 03编译的库之间的STL类不匹配的命名空间引起的.

例如,假设库B是A的依赖关系.B具有以下模板化类作为其接口的一部分.

template <class Type>
class VectorParameter
{
public:
    VectorParameter();
    virtual ~VectorParameter();

    ...
}
Run Code Online (Sandbox Code Playgroud)

库A用实例化实例化模板VectorParameter<std::pair<float, float>>.

当我使用C++ 11重新编译A而不重新编译B时,我遇到了抱怨的链接器错误

LFE::VectorParameter<std::__1::pair<float, float>>::~VectorParameter() is undefined symbol.

我认为这里的问题是库A使用std::__1::pair而B仍在使用std::pair.根据这个推理,我假设我需要重新编译在其接口中引用STL类型的所有依赖库.

如果是这种情况,那么将大型项目迁移到C++ 11将需要所有相关组同时切换,这在复杂项目中似乎不太实用.处理这个问题的最佳做法是什么?

Mar*_*som 9

几乎可以肯定库头文件已经更改,因此为了保持符合One Definition Rule,您必须重新编译所有内容.


mar*_*rko 4

您没有指定您的平台或编译器/库。

这里有一些关于 GNU ABI 兼容性的有趣注释(虽然有点过时)libStdc++——与 ABI 兼容性有一些隔离,但牺牲了真正的合规性。如果您使用的话,看起来似乎是全部或全部没有std::pair

libc++(这是clang的标准库)采用另一种方法,并有意将一个额外的命名空间(我相信称为__1)插入到其所有导出的符号中,这意味着可以在同一个可执行文件中链接libstdc++和。libc++如果您没有跨越新旧库之间的边界传递 STL 对象,那么您很可能能够使其发挥作用。