Seltsames Compiler/Linker Problem



  • Hallo,

    ich habe folgendes Problem. Ich habe eine Header-Datei (sequence.h), in der einige Klassen definiert werden, und eine dazugehörige CPP-Datei (sequence.cpp), in der die Definition von drei Funktionen der Klassen erfolgt. Nun habe ich noch eine weitere CPP-Datei, die etwas mit den Klassen herumspielt, um sie zu testen (test.cpp). Zum Kompilieren verwende ich (unter Linux) einfach den Befehl

    g++ sequence.cpp test.cpp
    

    Ist doch eigentlich alles richtig? Trotzdem beschwert sich der Linker, er könne einige Definitionen (genau die, die in sequence.cpp liegen) nicht finden. Hier mal der Quelltext der drei Dateien:

    http://home.arcor.de/phate_tg/sequence.h
    http://home.arcor.de/phate_tg/sequence.cpp
    http://home.arcor.de/phate_tg/test.cpp

    test.cpp:(.text+0xb6): undefined reference to `ISequenceReader<float>::operator[](unsigned int)'
    

    Vielen Dank im Voraus!



  • Das ist ein Template - Problem 😉

    Der Compiler, der sequence.cpp compiliert weiß nicht dass er ISequenceReader<flaot> braucht und erstellt es daher nicht und in test.cpp hat der compiler keine Möglichkeit ISequenceReader<float> zu erstellen.

    Da gibt's mehrere Lösungswege:

    1. Du gibst alles aus sequence.cpp auch in die .hpp als inline klassenfunktionen
    2. Du verwendest export und einen Compiler der das kann (g++ kanns nicht)
    3. Du sagst dem Compiler in sequence.cpp explizit dass du die Version für float gerne hättest


  • Danke für deine Antwort! Also Lösung 1 scheint mir ja noch am flexibelsten zu sein. Aber mal eine Frage, angenommen ich verwende nicht g++, wie sähe denn die Lösung mit "export" aus?



  • In diesem Fall musst du den Comeau Compiler verwenden (IMO macht's auch ein neuer Borland Compiler) und einfach im Header vor das template ein export schreiben.

    Ist aber nur von /sehr/ begrenztem Nutzen 😉

    EDIT://
    Und ich kann für nichts garantieren, ich Verwende primär G++ und sekundär MS VC8 und die können beide kein export


Anmelden zum Antworten