Home

Linker-Fehler und c++filt

Dienstag, 30. November 2010 | Autor:

Lin­ker-Error sind aus zwei Grün­den ekelhaft:
Ers­tens: Sie sind kryp­tisch sind, viel kryp­ti­scher als Com­pi­ler­feh­ler (ja, das geht).
Zwei­tens: Sie tre­ten unter Umstän­den erst zur Lauf­zeit auf.

Bei­spiel:
could not load plugin './algoStore/visAlgoslibStreakSurface.so' :./algoStore/visAlgoslibStreakSurface.so: undefined symbol: _ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E

Okay, undefined symbol - da haben wir wohl irgend­et­was dekla­riert, aber nicht defi­niert1. Aber was genau haben wir nicht definiert?
_ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E?
Manch­mal kann man erra­ten, was gemeint ist, da die Namen der invol­vier­ten Funk­tio­nen, Klas­sen, Varia­blen in dem Wust irgend­wo drin ste­hen. Aber eben nur manch­mal. Die Lösung die­ses Pro­blems lau­tet c++filt!

c++filt ist ein klei­nes Tool, das einem die Sym­bol­na­men ent­zif­fert! („deman­gled”). So wird’s benutzt:

> c++filt _ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E
FStreakSurfaceAlgorithm::split_edge(std::pair<FArray, FArray>)
>

und schon ken­nen wir den Klar­na­men des Sym­bols! Ein­fach toll - ich wünsch­te, ich hät­te die­ses Tool schon frü­her gekannt!

  1. Dekla­ra­ti­on = „Es gibt die­se und jene Funk­ti­on!” Bsp: void funktion(double k); Dekla­ra­tio­nen ste­hen typi­scher­wei­se in Hea­der-Files. -- Definition/Implementation = „Die Funk­ti­on tut die­ses hier.” Bsp: void funktion(double k){ return 1./(k+1); } -- Man beach­te, dass die Dekla­ra­ti­on wirk­lich eine rei­ne Exis­tenz­be­haup­tung ist und erst die Defi­ni­ti­on das Ver­hal­ten der Funk­ti­on defi­niert, d.h. den Code ent­hält, den die­se aus­führt.
Tags »

Trackback: