Home

Linker-Fehler und c++filt

Dienstag, 30. November 2010 | Autor:

Lin­ker-Error sind aus zwei Grün­den ekel­haft:
Ers­tens: Sie sind kryp­tisch sind, viel kryp­ti­scher als Com­pi­l­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 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! („demang­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ü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: Trackback-URL |  Feed zum Beitrag: RSS 2.0
Thema: Programmieren

Diesen Beitrag kommentieren.

4 Kommentare

  1. 1
    der_karl 

    Hach je, hät­te ich das Tool vor 5 Jah­ren gekannt, dann wär mir auch so man­cher Fluch erspart geblie­ben. Mitt­ler­wei­le kann ich die deko­rier­ten Funk­ti­ons­na­men auch so pro­blem­los lesen - wobei es ja zuge­ge­be­ner­ma­ßen so schwer auch nicht ist. 😉

  2. 2
    nikita 

    Kennst du zufäl­lig eine Sei­te oder so, in dem beschrie­ben ist, wie man die Din­ger liest? Danach hat­te ich näm­lich eigent­lich gesucht, als ich c++filt gefun­den habe.
    Oder lernt man das ein­fach, indem man die Din­ger regel­mä­ßig sieht, und dann merkt, dass bestimm­te Zei­chen bestimm­te Din­ge bedeu­ten?

  3. 3
    der_karl 

    Bei mir war’s Lear­ning by Doing. 😉 Wobei mei­ne Erfah­rung ist, dass der gcc zum Teil kryp­ti­sche­re Funk­ti­ons­na­men gene­riert, als der Micro­soft-Com­pi­ler unter Win­dows.

    Pro­ble­ma­tisch dürf­te bei mir viel­leicht eher wer­den, dass ich das lesen der deko­rier­ten Funk­ti­ons­na­men wie­der ver­ler­ne. Bin ja bei uns in der Fir­ma seit drei Mona­ten nicht mehr in der Ent­wick­lung…

  1. […] aka QListData::detach(int) […]

Kommentar abgeben