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
auf regulär std::string
umzusteigen, aber googeln kann ich nicht finden, und dies (string)
funktioniert nicht.
Wenn ich nicht konvertiere, erhalte ich folgende Linker-Fehler:
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'
insertMember()
Methode nicht finden kann.c++11
typedef __cxx11::basic_string basic_string
irgendwo imstd
Namespace des String-Headers etwas befindet. Kompilieren Sie auch die KompilierungseinheitH5::CompType
?gcc
anstattg++
zu kompilieren ...Antworten:
Ist es möglich, dass Sie GCC 5 verwenden?
Quelle: GCC 5 Release Notes / Dual ABI
Das Definieren des folgenden Makros vor dem Einfügen von Standardbibliotheksheadern sollte Ihr Problem beheben:
#define _GLIBCXX_USE_CXX11_ABI 0
quelle
undefined reference
und bevor ich nach einer Lösung suchte, überprüfte ich meine gesamte Verknüpfung im Programm und fand nichts. Danach entschied ich mich, im Web zu suchen und fand dies. Es funktioniert wie Charme, danke :)Wenn Sie alle inkompatiblen Bibliotheken, die Sie verwenden, neu kompilieren können, tun Sie dies mit der Compiler-Option
und erstellen Sie dann Ihr Projekt neu. Wenn Sie dies nicht tun können, fügen Sie die Makefile-Compiler-Option Ihres Projekts hinzu
Die definieren
ist auch gut, aber Sie müssen es wahrscheinlich zu allen Ihren Dateien hinzufügen, während die Compiler-Option dies für alle Dateien gleichzeitig tut.
quelle
Wenn ich ein ähnliches Problem hatte, ist es passiert, weil meine Bibliothek mit erstellt
clang++
wurde undlibstdc++.so
auf meinem System standardmäßig mit verknüpft ist. Während App-Binärdateiclang
mit-lc++
Option erstellt und mit Option verknüpft wurde .Der einfachste Weg, Abhängigkeiten zu überprüfen, ist die Durchführung
ldd libName.so
Um dies zu beheben, sollten Sie dieselbe Bibliothek in App und Bibliothek verwenden.
Einfachster Weg. Erstellen Sie eine Bibliothek mit
clang++
und kompilieren Sie eine App mitclang++
. Ohne zusätzliche Verknüpfungsoptionen für beide Schritte. Standardmäßig wird stdlib verwendet.Bibliothek
-stdlib=c++
erstellen mit und App kompilieren mit-lc++
. In diesem Fall werden sowohl die Bibliothek als auch die App verwendetlibc++.so
.Erstellen Sie eine Bibliothek ohne zusätzliche Optionen und verknüpfen Sie die Binärdatei mit
-lstdc++
. In diesem Fall werden sowohl die Bibliothek als auch die App verwendetlibstdc++.so
.quelle
Die Antworten hier konzentrieren sich hauptsächlich auf kurze Wege, um das Problem zu beheben. Wenn dies jedoch nicht hilft, gebe ich einige Schritte zur Überprüfung an, die mir geholfen haben (nur Linux):
Listen Sie die Symbole in der Bibliothek auf und suchen 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
no symbols
stattdessen die Signatur erhalten haben, haben Sie höchstwahrscheinlich alle Symbole aus der Bibliothek entfernt. Deshalb kann der Linker sie beim Verknüpfen der Bibliothek nicht finden. Erstellen Sie die Bibliothek neu, ohne ALLE Symbole zu entfernenstrip -S
. Bei Bedarf können Sie Debug- Symbole ( Optionssymbole) entfernen.Verwenden Sie einen C ++ - Demangler, um die Methodensignatur zu verstehen, z. B. diese
quelle
Ich habe dies erhalten. Die einzige Möglichkeit, dies zu beheben, bestand darin, das gesamte mingw-64 zu aktualisieren (ich habe dies zu Ihrer Information mit pacman auf msys2 durchgeführt).
quelle
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.
quelle
Ich hatte kürzlich ein ähnliches Problem, als ich versuchte, eine Verbindung zu den vorgefertigten Binärdateien von hdf5 Version 1.10.5 unter Ubuntu 16.04 herzustellen . Keine der hier vorgeschlagenen Lösungen funktionierte für mich und ich verwendete g ++ Version 9.1. Ich fand, dass die beste Lösung darin besteht, die hdf5-Bibliothek aus dem Quellcode zu erstellen. Verwenden Sie nicht die vorgefertigten Binärdateien, da diese mit gcc 4.9 erstellt wurden! Laden Sie stattdessen die Quellcodearchive von der HDF- Website für Ihre spezielle Distribution herunter und erstellen Sie die Bibliothek. Es ist sehr leicht.
Sie benötigen auch die Komprimierungsbibliotheken zlib und szip von hier bzw. hier , wenn Sie sie noch nicht auf Ihrem System haben.
quelle
In meinem Fall hatte ich ein ähnliches Problem:
/usr/bin/ld: Bank.cpp:(.text+0x19c): undefined reference to 'Account::SetBank(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' collect2: error: ld returned 1 exit status
Nach einigen Recherchen stellte ich fest, dass das Problem durch die Art und Weise verursacht wurde, wie Visual Studio Code die Datei Bank.cpp kompilierte. Um dies zu lösen, habe ich nur den Befehl follow aufgerufen, um die erfolgreiche C ++ - Datei zu kompilieren:
Mit dem obigen Befehl konnte es die Header-, Implementierungs- und Main-C ++ - Dateien korrekt verknüpfen.
OBS: Meine g ++ Version: 9.3.0 unter Ubuntu 20.04
quelle