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.

Tags »

Trackback: Trackback-URL |  Feed zum Beitrag: RSS 2.0
Thema: Programmieren

Diesen Beitrag kommentieren.

4 Kommentare

  1. 1
    der_karl 

    Hach je, hätte ich das Tool vor 5 Jah­ren gekannt, dann wär mir auch so man­cher Fluch erspart geblie­ben. Mitt­ler­weile 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 Seite oder so, in dem beschrie­ben ist, wie man die Din­ger liest? Danach hatte 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 bestimmte Zei­chen bestimmte Dinge bedeuten?

  3. 3
    der_karl 

    Bei mir war’s Learning by Doing. ;) Wobei meine Erfah­rung ist, dass der gcc zum Teil kryp­ti­schere Funk­ti­ons­na­men gene­riert, als der Microsoft-Compiler unter Windows.

    Pro­ble­ma­tisch dürfte bei mir viel­leicht eher wer­den, dass ich das lesen der deko­rier­ten Funk­ti­ons­na­men wie­der ver­lerne. Bin ja bei uns in der Firma seit drei Mona­ten nicht mehr in der Entwicklung…

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

Kommentar abgeben