Preambuła
Praca z dużym kawałku kodu, który nie mogę obecnie rozbić się o MCVE, więc Zrobię Najlepiej.Korzystanie C++ 11 versus GCC 4.8 domyślnych przyczyn odwołuje się błąd z prywatnym dziedziczenia i zwiększyć
Problem
pracuję z dużym projektem, który jest kompilowany jako biblioteka statyczna, libfoo.a
. Odrębny projekt, bar
, łączy się z tą biblioteką. W „popełniła” fragment w libfoo
jest następujący:
class Base {
public:
void foo(){}
void bar(){}
};
class Derived : private Base {
public:
using Base::foo;
};
Zarówno libfoo
i bar
szerokie wykorzystanie boost. bar
musi być skompilowany z -std=c++11
powodu cech C++ 11 to wykorzystuje, ale libfoo
może zostać skompilowany z minimalnymi opcji (czyli opcje kompilatora Domyślne wykorzystywane przez v4.8 GCC, który wydaje się być -std=c++0x
-std=gnu++03
).
Gdy próbuję połączyć bar
przy użyciu domyślne GCC skompilowane -std=c++0x
libfoo.a
, nie jest on z długiego, nazwa-zniekształcone ostrzeżenia, co zmniejsza do:
Undefined reference to Base::Derived::foo()
Kiedy odbudować libfoo.a
z numerem -std=c++11
ten problem już nie występuje.
dotychczasowej pracy
Porównałem wyjście libfoo.a
poprzez nm iw obu przypadkach, odpowiednie symbole były obecne. Przeszedłem także przez the Cxx11Abi compatibility documents i nie wydaje się, aby to ustawienie kompilatora miało "złamać" kompatybilność.
Pytanie
Jaka jest przyczynatego łącznika problemu?
co masz na myśli mówiąc o "minimalnych ustawieniach"? nie powinno się "-std = C++ 11" być takie samo jak '-std = C++ 0x'? – user463035818
@ tobi303 Przez to miałem na myśli brak dodatkowych opcji kompilatora (tj. Domyślne ustawienia przez kompilator: GCC v4.8.4 w tym przypadku). – DevNull
Problemem może być to, że środowisko będzie miało inne nagłówki dla wersji roboczej i dla wydania 2011 standard – Swift