it-swarm.com.de

Konvertierung von std :: __ cxx11 :: string in std :: string

Ich verwende C++ 11, aber auch einige Bibliotheken, die nicht dafür konfiguriert sind und eine Typkonvertierung benötigen. Insbesondere brauche ich einen Weg, um std::__cxx11::string in regulären std::string umzuwandeln, aber googeln finde ich keinen Weg, dies zu tun, und (string) voranzustellen funktioniert nicht.

Wenn ich nicht konvertiere, erhalte ich Linker-Fehler wie folgt:

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'
62
jorgen

Ist es möglich, dass Sie GCC 5 verwenden?

Wenn Sie Linker-Fehler bei undefinierten Verweisen auf Symbole erhalten, die Typen im Namespace std :: __ cxx11 oder das Tag [abi: cxx11] enthalten, weist dies wahrscheinlich darauf hin, dass Sie versuchen, Objektdateien miteinander zu verknüpfen, die mit unterschiedlichen Werten für _GLIBCXX_USE_CXX11_ABI kompiliert wurden Makro. Dies tritt häufig auf, wenn auf eine Bibliothek eines Drittanbieters verlinkt wird, die mit einer älteren Version von GCC kompiliert wurde. Wenn die Drittanbieter-Bibliothek nicht mit der neuen ABI neu erstellt werden kann, müssen Sie Ihren Code mit der alten ABI neu kompilieren.

Quelle: GCC 5 Versionshinweise/Dual ABI

Das Definieren des folgenden Makros before einschließlich der Standard-Bibliothekskopfzeilen sollte das Problem beheben: #define _GLIBCXX_USE_CXX11_ABI 0

81

Wenn Sie alle inkompatiblen Bibliotheken, die Sie verwenden, neu kompilieren können, verwenden Sie die Compiler-Option 

-D_GLIBCXX_USE_CXX11_ABI = 1

und bauen Sie dann Ihr Projekt neu auf. Wenn dies nicht möglich ist, fügen Sie die Makefile-Compiler-Option Ihres Projekts hinzu

-D_GLIBCXX_USE_CXX11_ABI = 0

Die definieren

#define _GLIBCXX_USE_CXX11_ABI 0/1

ist auch gut, aber Sie müssen es wahrscheinlich zu allen Ihren Dateien hinzufügen, während die Compiler-Option es für alle Dateien gleichzeitig tut.

44
Denis Sirotkin

Die Antworten hier konzentrieren sich hauptsächlich auf kurze Wege, um das Problem zu beheben. Wenn dies jedoch nicht hilft, gebe ich einige Schritte an, um zu überprüfen, ob dies mir geholfen hat (nur Linux):

  • Wenn die Linker-Fehler beim Verknüpfen anderer Bibliotheken auftreten, erstellen Sie diese Bibliotheken mit Debug-Symbolen (GCC-Flag "-g").
  • Listen Sie die Symbole in der Bibliothek auf und lesen Sie die Symbole, über die sich der Linker beschwert (geben Sie die Befehle in die Befehlszeile ein):

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

  • Wenn Sie die Methodensignatur erhalten haben, fahren Sie mit dem nächsten Schritt fort. Wenn Sie stattdessen no symbols erhalten haben, haben Sie höchstwahrscheinlich alle Symbole aus der Bibliothek entfernt, und aus diesem Grund kann der Linker sie beim Verknüpfen der Bibliothek nicht finden. Erstellen Sie die Bibliothek neu, ohne ALLE Symbole zu entfernen. Sie können bei Bedarf die Debugsymbole (Option strip -S) entfernen.

  • Verwenden Sie einen c ++ - Demangler, um die Methodensignatur zu verstehen, z. B. diese

  • Vergleichen Sie die Methodensignatur in der Bibliothek, die Sie gerade erhalten haben, mit der, die Sie im Code verwenden (überprüfen Sie auch die Header-Datei). Wenn sie unterschiedlich sind, verwenden Sie den richtigen Header oder die richtige Bibliothek oder eine andere Methode, die Sie jetzt kennen, um das Problem zu beheben
1
rightaway717

Für mich hat -D_GLIBCXX_USE_CXX11_ABI = 0 nicht geholfen.

Es funktioniert, nachdem ich mit C++ libs Version anstelle von gnustl verlinkt habe.

0
dimon4eg

Wenn ich ein ähnliches Problem hatte, ist es passiert, weil meine Bibliothek mit clang++ erstellt wurde und auf meinem System standardmäßig mit libstdc++.so verknüpft ist. Während die App-Binärdatei mit der Option clang erstellt und mit der Option -lc++ verknüpft wurde.

Am einfachsten können Sie Abhängigkeiten überprüfen, indem Sie ldd libName.so ausführen.

Um dies zu beheben, sollten Sie dieselbe Bibliothek in App und Bibliothek verwenden.

  • Einfachster Weg. Erstellen Sie eine Bibliothek mit clang++ und kompilieren Sie die App mit clang++. Ohne zusätzliche Verknüpfungsoptionen in beiden Schritten. Standardmäßig wird stdlib verwendet.

  • Erstellen Sie eine Bibliothek mit -stdlib=c++ und kompilieren Sie die App mit -lc++. In diesem Fall verwenden sowohl die Bibliothek als auch die App libc++.so.

  • Erstellen Sie eine Bibliothek ohne zusätzliche Optionen und verknüpfen Sie die Binärdatei mit -lstdc++. In diesem Fall verwenden sowohl die Bibliothek als auch die App libstdc++.so.

0
Evgen Bodunov

Ich habe dieses Problem gelöst. Die einzige Möglichkeit, dieses Problem zu beheben, bestand darin, das gesamte mingw-64 zu aktualisieren.

0
ceorron