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

C++ 切换到C++;11,是否有必要重新编译所有在接口中使用STL的依赖项库?,c++,c++11,stl,C++,C++11,Stl,我正在尝试将一个大型项目转换为使用C++11。我遇到了大量链接器错误,这些错误似乎是由使用C++11编译的库和使用C++03编译的库之间STL类上的命名空间不匹配引起的 例如,假设库B是a的依赖项。B有以下模板类作为其接口的一部分 template <class Type> class VectorParameter { public: VectorParameter(); virtual ~VectorParameter(); ... } 模板 类向量参

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

例如,假设库B是a的依赖项。B有以下模板类作为其接口的一部分

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

    ...
}
模板
类向量参数
{
公众:
向量参数();
虚~向量参数();
...
}
库A使用
VectorParameter
实例化模板

当我用C++11重新编译A而没有重新编译B时,我遇到了一个链接器错误,它抱怨

LFE::VectorParameter::~VectorParameter()是未定义的符号。

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


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

几乎可以肯定库头文件已更改,因此,要保持符合,您必须重新编译所有内容。

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

关于GNU的ABI兼容性有一些有趣的注意事项(尽管有点过时)
libStdc++
——在某种程度上与ABI兼容性隔离,但牺牲了真正的合规性。如果您使用
std::pair
,这里看起来似乎是全部还是全部

libc++
(它是
clang
的标准库)采用了另一种方法,有意地在其所有导出符号中插入一个额外的名称空间(我相信称为
\uu 1
),这意味着可以在同一个可执行文件中链接
libstdc++
libc++

如果您没有跨越新旧库之间的边界传递STL对象,您很可能能够使其正常工作。

我宁愿安全,抱歉,也就是说,重新编译该部分。这是一个开-关事件。很可能,C++03和C++11之间的标准库ABI不同。如果不在所有相关的依赖项上抛出C++11开关,我甚至不会尝试这样做。C++11是一个很大的标志……可能是重复的:你应该重建所有依赖STL的东西。但是考虑到您发布的代码,我想知道您是否将模板声明放在了头文件中,将定义放在了实现文件中。这也会导致“未定义符号”错误;修复方法是要么将声明/定义都放在头中,要么使用外部模板(C++11特性:)。