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 Befehlg++ 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 Meldungneighbor_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.oEdit: Natürlich vollkommen richtig mit .o ... sollte keine posts mehr am Morgen schreiben
-
und linkt sie dann zu einer ausführbaren Datei
g++ -o Name file1.cpp file2.cppHier 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.