我正在嘗試將大型項目切換爲使用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是一個很大的標誌... –