序言
有一大塊的代碼,我目前無法分解成一個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;
};
兩個libfoo
和bar
廣泛使用的boost。 bar
必須與-std=c++11
被編譯由於C++ 11特徵它利用,但libfoo
可以用最少的選項進行編譯(即,由GCC V4.8,這似乎是-std=gnu++03
使用默認編譯選項)。-std=c++0x
當我嘗試使用GCC默認編譯-std=c++0x
libfoo.a
鏈接bar
時,出現一個漫長的,名稱錯位警告,從而降低到:
Undefined reference to Base::Derived::foo()
當我重新建立libfoo.a
與-std=c++11
,此問題不再發生。
工作至今
我通過nm相比libfoo.a
輸出,並在這兩種情況下,相應的符號存在。我也經歷了the Cxx11Abi compatibility documents,並且這個編譯器設置不應該「破壞」兼容性。
問題
什麼原因這個鏈接問題?
「最低設置」是什麼意思? shouldnt'-std = C++ 11'與'-std = C++ 0x'相同嗎? – user463035818
@ tobi303因此,我的意思是沒有額外的編譯選項(即編譯器的默認設置:在這種情況下爲GCC v4.8.4)。 – DevNull
問題可能是環境會爲不同的標題草稿和發佈2011標準 – Swift