2017-07-27 9 views
5

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 . 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 -std=c++0xDomyślne wykorzystywane przez v4.8 GCC, który wydaje się być -std=gnu++03).

Gdy próbuję połączyć bar przy użyciu -std=c++0xdomyślne GCC skompilowane 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 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?

+0

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

+0

@ 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

+0

Problemem może być to, że środowisko będzie miało inne nagłówki dla wersji roboczej i dla wydania 2011 standard – Swift

Odpowiedz

0

Jak zauważa MartinBonner, miało to związek ze zmianami przestrzeni nazw na typy używane w prototypach funkcji. Jedynymi rozwiązaniami były albo kompilacja przez -std=c++11 albo ponowne napisanie ogromnej ilości kodu, aby mieć dodatkową warstwę "abstrakcji" wokół typu.

+0

Czy możesz podać przykład zmiany w przestrzeni nazw? Zrobiłoby to znacznie lepszą odpowiedź. –

Powiązane problemy