Home

Linker-Fehler und c++filt

Dienstag, 30. November 2010 | Autor:

Linker-Error sind aus zwei Grün­den ekel­haft:
Ers­tens: Sie sind kryp­tisch sind, viel kryp­ti­scher als Com­pil­er­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 defi­niert?
_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 irgendwo 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­g­led”). 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ünschte, ich hätte die­ses Tool schon frü­her gekannt!

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

Thema: Programmieren | 4 Kommentare

Debugger - GDB

Montag, 22. November 2010 | Autor:

Debug­ger sind Pro­gramme, die einem bei der Feh­ler­su­che hel­fen sol­len. Mit einem Debug­ger kann man das Pro­gramm quasi bei der Arbeit beob­ach­ten: Wel­che Code­zeile wird als nächs­tes aus­ge­führt? Was ent­hält diese und jene Varia­ble momen­tan? Wie sieht der Call-Stack/Backtrace momen­tan aus? An wel­cher Stelle stürzt das Pro­gramm genau ab? und vie­les ande­res mehr.

Für C++ (und jede Menge ande­rer Spra­chen) gibt es den GNU-Debugger, kurz GDB. wei­ter…

Thema: Programmieren, Sezierte C++-Käfer | Beitrag kommentieren