2017-07-27 157 views
5

序言

有一大塊的代碼,我目前無法分解成一個MCVE工作,所以我會盡我最好。使用C++ 11與GCC 4.8默認原因鏈接錯誤與私有繼承和提升


問題

我與編譯爲靜態庫,libfoo.a一個大型的項目。一個單獨的項目bar與該庫鏈接。 「攻擊」片段在libfoo如下:

class Base { 
public: 
    void foo(){} 
    void bar(){} 
}; 

class Derived : private Base { 
public: 
    using Base::foo; 
}; 

兩個libfoobar廣泛使用的bar必須與-std=c++11被編譯由於C++ 11特徵它利用,但libfoo可以用最少的選項進行編譯(即,由GCC V4.8,這似乎是-std=gnu++03使用-std=c++0x默認編譯選項)。

當我嘗試使用-std=c++0xGCC默認編譯libfoo.a鏈接bar時,出現一個漫長的,名稱錯位警告,從而降低到:

Undefined reference to Base::Derived::foo() 

當我重新建立libfoo.a-std=c++11,此問題不再發生。


工作至今

我通過相比libfoo.a輸出,並在這兩種情況下,相應的符號存在。我也經歷了the Cxx11Abi compatibility documents,並且這個編譯器設置不應該「破壞」兼容性。


問題

什麼原因這個鏈接問題

+0

「最低設置」是什麼意思? shouldnt'-std = C++ 11'與'-std = C++ 0x'相同嗎? – user463035818

+0

@ tobi303因此,我的意思是沒有額外的編譯選項(即編譯器的默認設置:在這種情況下爲GCC v4.8.4)。 – DevNull

+0

問題可能是環境會爲不同的標題草稿和發佈2011標準 – Swift

回答

0

正如MartinBonner所說,它必須處理函數原型中使用的類型的名稱空間更改。唯一的解決方案是通過-std=c++11進行編譯或重新編寫海量代碼以在類型周圍增加一層「抽象」。

+0

你可以舉一個命名空間變化的例子嗎?這樣做會使這個更好的答案。 –