Linker Fehler: undefined reference to



  • Hallo,
    ich verwende den GNU G++ Compiler.
    Ich würde gerne die nachfolgenden Dateien linken und compilieren: https://test.mk16.de/scriptFiles/neighbor_letters.cpp, https://test.mk16.de/scriptFiles/mmatrix.hpp und https://test.mk16.de/scriptFiles/mmatrix.cpp
    In der Datei mmatrix.hpp ist die Klasse mmatrix deklariert. In der Datei mmatrix.cpp ist die Klasse mmatrix Definiert und die Datei neighbor_letters.cpp enthält die Main-Funktion, welche die Klasse mmatrix nutzt.
    Nun habe ich versucht die Dateien mit dem Befehl

    g++ mmatrix.cpp neighbor_letters.cpp -o neigthbor_letters.exe -m32 -save-temps -Wall -Wextra -Wpedantic
    

    zu compilieren und zu linken.
    Wobei bei mir aber immer die Meldung

    neighbor_letters.o:neighbor_letters.cpp:(.text+0x6db): undefined reference to `mmatrix<char>::mmatrix(unsigned int, unsigned int)'
    neighbor_letters.o:neighbor_letters.cpp:(.text+0x6ef): undefined reference to `mmatrix<char>::fill(char)'
    neighbor_letters.o:neighbor_letters.cpp:(.text+0x716): undefined reference to `mmatrix<char>::fill(std::function<char (unsigned int, unsigned int)>)'
    neighbor_letters.o:neighbor_letters.cpp:(.text+0x759): undefined reference to `mmatrix<char>::output(std::ostream&)'
    neighbor_letters.o:neighbor_letters.cpp:(.text+0x791): undefined reference to `mmatrix<char>::each(std::function<void (unsigned int, unsigned int, char*)>)'
    collect2.exe: Fehler: ld gab 1 als Ende-Status zur³ck
    

    Ich habe jetzt, als übergangs Lösung, zusätzlich zu #include "mmatrix.hpp" in die Datei neighbor_letters.cpp #include "mmatrix.cpp" reingeschrieben, danach konnte ich es mit diesem Befehl Compiliren/Linken.
    Kann mir jemand sagen warum dieser Fehler aufgetreten ist und wie ich diesen Beheben kann?
    Danke im Voraus
    Marek



  • Anfängerregel: Templates werden im Header implementiert.



  • Eine einfache Möglichkeit, die dir Trennung erlaubt (wie du es kennst mit .cpp und .h) ist die Datei mit den Inplementierungen am ende deinee Header vor dem endif zu inkluden.
    Da deine .cpp Datei dann aber letzendes eine header Datei ist, macht es Sinn sie umzubennen. Viele nehmen die Endung .inl für die Template Implementierungen.
    Alternativ kannst du es natürlich auch einfach alles direkt in die header machen.

    Dein Befehl zum kompilieren sieht sehr seltsam aus. Wäre mir neu das das so geht (aber ich lasse mich gerne belehren). Normalerweise kompiliert man die .cpp Dateien einzelnd
    g++ -c file1.cpp
    g++ -c file2.cpp
    und linkt sie dann zu einer ausführbaren Datei
    g++ -o Name file1.o file2.o

    Edit: Natürlich vollkommen richtig mit .o ... sollte keine posts mehr am Morgen schreiben 😃



  • @Leon0402

    und linkt sie dann zu einer ausführbaren Datei
    g++ -o Name file1.cpp file2.cpp

    Hier müsste dann aber .o und nicht.cpp stehen.

    aber ich lasse mich gerne belehren

    Wenn man den Compiler zu Fuß aufruft, ist das üblich.


Anmelden zum Antworten