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. ↩
Hach je, hätte ich das Tool vor 5 Jahren gekannt, dann wär mir auch so mancher Fluch erspart geblieben. Mittlerweile kann ich die dekorierten Funktionsnamen auch so problemlos lesen - wobei es ja zugegebenermaßen so schwer auch nicht ist. 😉
Kennst du zufällig eine Seite oder so, in dem beschrieben ist, wie man die Dinger liest? Danach hatte ich nämlich eigentlich gesucht, als ich c++filt gefunden habe.
Oder lernt man das einfach, indem man die Dinger regelmäßig sieht, und dann merkt, dass bestimmte Zeichen bestimmte Dinge bedeuten?
Bei mir war’s Learning by Doing. 😉 Wobei meine Erfahrung ist, dass der gcc zum Teil kryptischere Funktionsnamen generiert, als der Microsoft-Compiler unter Windows.
Problematisch dürfte bei mir vielleicht eher werden, dass ich das lesen der dekorierten Funktionsnamen wieder verlerne. Bin ja bei uns in der Firma seit drei Monaten nicht mehr in der Entwicklung…