2015-10-28 29 views
42

Używam C++ 11, ale także niektórych bibliotek, które nie są do niego skonfigurowane i potrzebują jakiejś konwersji typu. W szczególności potrzebuję sposobu na przekonwertowanie std::__cxx11::string na regularne std::string, ale szukanie w Google Nie mogę znaleźć sposobu na wykonanie tego i umieszczenie (string) z przodu nie działa.Konwersja std :: __ cxx11 :: string na std :: string

Jeśli nie przekształcić się błędy linkera tak:

undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const' 
+1

Błąd brzmi bardziej jak kompilator nie może znaleźć metody "insertMember()". –

+1

Hm, może go znaleźć z innymi programami, które mam, które nie używają 'C++ 11' – jorgen

+0

Właściwie to wydaje się być linkerem, a nie kompilatorem. Co oznacza "znajdowanie", jakie są te "inne programy"? –

Odpowiedz

57

to możliwe, że używasz GCC 5?

Jeśli masz linkera błędy dotyczące referencji niezdefiniowanych symboli, które dotyczą typów w std :: __ nazw cxx11 lub tag [abi: cxx11] to prawdopodobnie oznacza, że ​​próbujesz połączyć razem sprzeciw pliki, które zostały skompilowane z różnymi wartościami dla makra _GLIBCXX_USE_CXX11_ABI. Zwykle dzieje się tak podczas łączenia z biblioteką innej firmy, która została skompilowana ze starszą wersją GCC. Jeśli biblioteki innej firmy nie można odbudować przy użyciu nowego ABI, będziesz musiał przekompilować swój kod ze starą ABI.

Źródło: GCC 5 Release Notes/Dual ABI

Definiowanie następujące makro przed tym wszelkich standardowych nagłówków bibliotek powinno rozwiązać problem: #define _GLIBCXX_USE_CXX11_ABI 0

+1

Próbowałem tego; teraz dostaję błędy linkera wszędzie, gdzie używam funkcji C++ 11. Być może nie ma sposobu, aby to działało zarówno z C++ 11, jak i skompilowaną biblioteką hdf5. – jorgen

+0

Dla mnie, na Ubuntu 14.04, g ++ 6.2 domyślnie kompiluje się z tym zestawem na 0, podczas gdy 16.04, ta sama wersja g ++ kompiluje się z ustawionym na 1. 14.04, ustawienie tego na 1 wydaje się nie robić niczego; wynikowy plik obiektowy nie korzysta z ABI CXX11. Podejrzewam, że jest to ograniczenie systemowe. –

+0

Nie byłem pewien, dlaczego kompilator rzuca 'undefined reference' i zanim szukałem rozwiązania, sprawdziłem całe moje powiązanie w programie i nie znalazłem niczego. Potem zdecydowałem się na wyszukiwanie w Internecie i znalazłem to. Działa jak urok, dzięki :) – Shravan40

29

Jeśli można skompilować wszystkie niekompatybilne bibliotekami użyć, zrób to z opcją kompilatora

-D_GLIBCXX_USE_CXX11_ABI = 1

a następnie odbuduj swój projekt. Jeśli nie możesz zrobić, aby dodać opcję kompilatora makefile Twojego projektu

-D_GLIBCXX_USE_CXX11_ABI = 0

Define

#define _GLIBCXX_USE_CXX11_ABI 0/1

jest również dobry, ale prawdopodobnie musisz dodać go do wszystkich plików, podczas gdy opcja kompilatora zrobi to dla wszystkich plików naraz.

+1

Dla mnie działała flaga kompilatora. dzięki. Zmarnowałem 4 dni na tę głupią zmianę w gcc! –

+0

Dzięki. Ta flaga działała również dla mnie – hbobenicio

0

Mam to, jedyny sposób, w jaki znalazłem to naprawić, to zaktualizować wszystkie mingw-64 (zrobiłem to używając pacman na msys2 dla twoich informacji).

Powiązane problemy