undefined reference to... das alte Problem.
-
Hallo alle mit einander :D,
momentan schreibe ich aus lernzwecken eine etwas größere lib.
Nun habe ich die Tage versucht das geschriebene auch mal auszuprobiere,
doch was mir der gcc nur ausspuckt ist folgendes:NetBeansProjects/Lanthal/main.cpp:23: undefined reference to `Lanthal::Core::Patterns::SingletonLanthal::Core::Logger::GetInstance()'
NetBeansProjects/Core/include/Logger.cpp:34: undefined reference to `Lanthal::Core::Patterns::SingletonLanthal::Core::Logger::Singleton()'
NetBeansProjects/Core/include/Logger.cpp:34: undefined reference to `Lanthal::Core::Patterns::SingletonLanthal::Core::Logger::Singleton()'
Erster gedanke war das ich depp vergessen hab die memberfunktion zu
schreiben. Aber die waren schon längst definiert.Dann dacht ich ich habe vergessen die die Lib zu linken. Ist aber auch nicht der fall. Die Lib war schon gelinkt.
Mir fällt zum verrecken nicht ein was ich dagegen machen könnt.
So mal etwas zum code:
Verwendet habe ich eine Singleton klasse auf Basis von Templatesnamespace Lanthal { namespace Core { namespace Patterns { template <typename type> class Singleton { private: static type* m_instance; Singleton( const Singleton& ); Singleton& operator=( const Singleton& ); protected: Singleton(); public: static type& GetInstance(); }; } }sowie einen kleinen Logger:
#include "patterns/Singleton.h" #include <string> #include "Filehandling/File.h" namespace Lanthal { namespace Core { class Logger : public Patterns::Singleton<Logger> { private: std::string m_Logbuffer; File_Handling::File *m_Logfile; Logger(); protected: public: ~Logger(); friend class Patterns::Singleton<Logger>; Logger& operator<<(const std::string&); }; } }Ich selber finde leider den Fehler im Code selbst nicht. Kann es sein das ich etwas übersehen habe? Bin sehr dankbar über jeden Einfall den ihr habt der zur lösung führt.
-
templates in Codedatei statt im Header definiert? Linkreihenfolge falsch? Es gibt lauter wahrscheinliche und unwahrscheinliche Gründe für diesen Fehler. Ohne mehr Informationen kann man nichts genaueres sagen*.
Dies ist übrigens nicht gerade eine Linux/Unix-Programmierungsfrage, sondern eher für das Standard-C++-Forum.
*: Prüf aber mal trotzdem meine beiden Vorschläge. Erfahrungsgemäß sind das die häufigsten Ursachen.
-
Wo hast Du die 2 bemängelten Funktionen denn definiert? Ich sehe in Deinen Codeausschnitten nur die Deklaration.
-
Da hast du nicht ganz unrecht, habs zuspät gesehen das ich das hier unter linux/unix gepostet hab.
In der Source-datei so wie man es normalerweise oft auch tut.
Hab die Linkreihenfolge geprüft und testweise geändert, keiner änderung.Die templates habe ich im Header-deklariert...und in einer Source definiert. Das ich das net selber sah, ist schon arg traurig. Hab die Definition nun in eine Template-Header gesteckt.
Die erste Fehlermeldung hab ich damit weg bekommen.
So dann auch hier mal die Source-datei
Logger.cpp:#include "Logger.h" namespace Lanthal { namespace Core { Logger::Logger() : Singleton() //<- Hier kommt der Fehler { this->m_Logfile = new File_Handling::File("logs/protocoll.txt"); } Logger::~Logger() { //this->m_Logfile->~File(); } Logger& Logger::operator <<(const std::string& msg) { this->m_Logfile->Write(const_cast<char*>(msg.c_str()),msg.size()); return *this; } } }und Singleton.tcc
namespace Lanthal { namespace Core { namespace Patterns { template <typename type> type* Singleton <type>::m_instance = 0; /* Hier definiere ich den Singleton ctor im Header längst schon deklariert */ template<typename type> Singleton<type>::Singleton() { } template<typename type> Singleton<type>::Singleton(const Singleton& c) { } template<typename type> type& Singleton<type>::GetInstance() { if (!m_instance) { m_instance = new type(); return *m_instance; } return *m_instance; } template<typename type> Singleton<type>& Singleton<type>::operator =(const Singleton& c) { return *this; } } } }
-
exOfde schrieb:
/* Hier definiere ich den Singleton ctor im Header längst schon deklariert */Das geht so nicht; war auch Sepp Js erster Tip. Definiere das Zeug direkt im Header und fertig.
edit: Wobei "das Zeug" == "alle Templatemethoden".
-
Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
exOfde schrieb:
In der Source-datei so wie man es normalerweise oft auch tut.
Es sei denn man schreibt Templates, da macht man das normalerweise extrem oft nicht.