Mam problem z nowym ABI wprowadzonym dla C++ 11 w GCC. Po aktualizacji do GCC 5.3 mój projekt nie jest już kompilowany. Komunikaty o błędach dostaję są proste:G + nowe problemy ABI
undefined reference to `tokenize(std::__cxx11::basic_string' ...more characters
lub
undefined reference to `extract(std::string const&)'
Tak, wygląda na to, że zawiedli coś i GCC jest w stanie zdecydować, czy chcę starego ABI lub nowej jeden (Brakuje części z niektórych komunikatów o błędach i występuje w innych)?
Próbowałem kilka rozwiązań, aby rozwiązać ten problem:
- przechodzącego
-D_GLIBCXX_USE_CXX11_ABI=0
do GCC, - przechodząc
-D_GLIBCXX_USE_CXX11_ABI=1
do GCC, - ustawieniu makro bezpośrednio w kodzie źródłowym,
- ustawienie atrybutu
abi_tag
w sprawie oświadczeń złożonych przez GCC na skargę po przyjęciu flagi-Wabi-tag
,
Niestety, żaden z nich nie działał (tj. zezwolono na kompilację kodu). Jedyne, co wiem to to, że tylko funkcje zwracające std::string
lub przyjmowanie go jako parametru nie dają się połączyć. Które można się spodziewać, biorąc pod uwagę to, co czytałem o problemie w Internecie. Nie udało mi się odtworzyć problemu w prostym, przykładowym programie do przedstawienia go tutaj.
Czy istnieje jakieś oczywiste rozwiązanie mojego problemu, którego mi brakuje?
To błąd łącznika, a nie błąd kompilatora. Sugeruje to, że skompilowane obiekty i biblioteki, które próbujesz połączyć, zostały skompilowane z różnymi ABI. – rici
@rici Tak, masz rację. Mam świadomość, że problem występuje podczas łączenia. Jednak to kompilator emituje kod, który ma być połączony (lub brakuje mi mojego zrozumienia?). To, czego nie wiem, to dlaczego G ++ emituje kod czasami używając nowego, a czasem starego ABI, nawet gdy robię pełne rekompilacje kodu. – Mael