2014-07-11 75 views
6

我正在尝试将大型项目切换为使用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将需要所有相关的组同时切换,这在复杂的项目中似乎不太实际。处理这个问题的最佳做法是什么?

+3

我宁愿安然对不起 - 也就是说,重新编译这个地段。这是一个关闭事件。 –

+2

很可能,标准库ABI在C++ 03和C++ 11之间会有所不同。我甚至不会在不涉及所有涉及的依赖关系的情况下尝试执行此操作。 – Praetorian

+2

一般来说,所有的库必须编译时使用非常相似的标志(如果不是相同的)。而C + + 11是一个很大的标志... –

回答

3

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

有一些有趣的注意事项here(虽然有点过时了)关于ABI兼容性GNU libStdc++ - 有一些与ABI兼容性的绝缘,但牺牲了真正的兼容性。如果您使用std::pair,它看起来好像是全部或全部没有。

libc++(这是clang标准库)采用另一种方法,故意插入额外的命名空间(我相信所谓的__1)将其所有输出的符号,这意味着它可以在同一个可执行文件都libstdc++libc++链接。 假设你没有将STL对象跨越新老库的边界,你可能会得到这个工作。

8

几乎可以确定库头文件已经改变,因此要保持符合One Definition Rule,您必须重新编译所有内容。

相关问题