我正在尝试将大型项目切换为使用C++ 11。我遇到了大量的链接器错误,这些错误似乎是由用C++ 11编译的库与用C++ 03编译的库之间的STL类上的命名空间不匹配造成的。切换到C++ 11时,是否需要重新编译在接口中使用STL的所有依赖库?
作为一个例子,说库B是A的依赖关系。B具有以下模板类作为其接口的一部分。
template <class Type>
class VectorParameter
{
public:
VectorParameter();
virtual ~VectorParameter();
...
}
库A实例化模板VectorParameter<std::pair<float, float>>
。
当我重新编译C++ 11一个无需重新编译B,我遇到了那个抱怨
LFE::VectorParameter<std::__1::pair<float, float>>::~VectorParameter() is undefined symbol.
我觉得这里的问题是,库中的使用std::__1::pair
而B仍然使用std::pair
链接错误。根据这个推理,我假设我需要重新编译所有在其接口中引用STL类型的依赖库。
如果是这种情况,那么将一个大型项目迁移到C++ 11将需要所有相关的组同时切换,这在复杂的项目中似乎不太实际。处理这个问题的最佳做法是什么?
我宁愿安然对不起 - 也就是说,重新编译这个地段。这是一个关闭事件。 –
很可能,标准库ABI在C++ 03和C++ 11之间会有所不同。我甚至不会在不涉及所有涉及的依赖关系的情况下尝试执行此操作。 – Praetorian
一般来说,所有的库必须编译时使用非常相似的标志(如果不是相同的)。而C + + 11是一个很大的标志... –