Linker-Fehler und c++filt
Dienstag, 30. November 2010 | Autor: Nico
Linker-Error sind aus zwei Gründen ekelhaft:
Erstens: Sie sind kryptisch sind, viel kryptischer als Compilerfehler (ja, das geht).
Zweitens: Sie treten unter Umständen erst zur Laufzeit auf.
Beispiel:
could not load plugin './algoStore/visAlgoslibStreakSurface.so' :./algoStore/visAlgoslibStreakSurface.so: undefined symbol: _ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E
Okay, undefined symbol -
da haben wir wohl irgendetwas deklariert, aber nicht definiert1. Aber was genau haben wir nicht definiert?
_ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E
?
Manchmal kann man erraten, was gemeint ist, da die Namen der involvierten Funktionen, Klassen, Variablen in dem Wust irgendwo drin stehen. Aber eben nur manchmal. Die Lösung dieses Problems lautet c++filt!
c++filt ist ein kleines Tool, das einem die Symbolnamen entziffert! („demangled”). So wird’s benutzt:
> c++filt _ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E
FStreakSurfaceAlgorithm::split_edge(std::pair<FArray, FArray>)
>
und schon kennen wir den Klarnamen des Symbols! Einfach toll - ich wünschte, ich hätte dieses Tool schon früher gekannt!
- Deklaration = „Es gibt diese und jene Funktion!” Bsp: void funktion(double k); Deklarationen stehen typischerweise in Header-Files. -- Definition/Implementation = „Die Funktion tut dieses hier.” Bsp: void funktion(double k){ return 1./(k+1); } -- Man beachte, dass die Deklaration wirklich eine reine Existenzbehauptung ist und erst die Definition das Verhalten der Funktion definiert, d.h. den Code enthält, den diese ausführt. ↩