2014-07-11 76 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,您必須重新編譯所有內容。

相關問題