Fehler "undefined reference ... " trotz eingebundener Headerdatei
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hallo zusammen,
ich schreib mir gerade ein Programm in C++ ein eigenes Programm zur
Überwachung von Netzwerkadressen. Allerdings kriege ich beim Compilieren
immer folgende Fehlermeldungen:
- ---------------------------Fehler--------------------------
*g++ -lpcap -lmysqlclient -o nwarp nwarp.o nw_standarts.o nw_database.o
nw_device.o nw_dev_storage.o -L/usr/lib/ -L/usr/lib/qt3/lib/
- -L/usr/X11R6/lib/ -lqt-mt -lXext -lX11 -lm -lpthread
*nw_device.o(.text+0x7a): In function `nw_device::nw_device[not-in-charge]
(char*, char*, char*, nw_sniff_count, int)':
*: undefined reference to `nw_queue
* Udo Gerhards (Udo.Gerhards@genion.de) [20041001 14:40]:
*g++ -lpcap -lmysqlclient -o nwarp nwarp.o nw_standarts.o nw_database.o nw_device.o nw_dev_storage.o -L/usr/lib/ -L/usr/lib/qt3/lib/ - -L/usr/X11R6/lib/ -lqt-mt -lXext -lX11 -lm -lpthread *nw_device.o(.text+0x7a): In function `nw_device::nw_device[not-in-charge] (char*, char*, char*, nw_sniff_count, int)': *: undefined reference to `nw_queue
::nw_queue[in-charge](int)'
Soweit ich das jetzt verstehe, ist in dem File die Deklaration der Templateklasse "nw_queue
" nicht bekannt,
Dann hätte sich der Compiler schon viel früher beschwert. Hier wurde ein
Konstruktor nicht instanziert, aber warum das so ist, könnte man nur anhand
des/der Header(s) und ggfs. des ihn/sie verwendenden Codes beurteilen.
Philipp
--
Philipp Thomas
Am Dienstag, 5. Oktober 2004 14:54 schrieb Philipp Thomas:
* Udo Gerhards (Udo.Gerhards@genion.de) [20041001 14:40]:
*g++ -lpcap -lmysqlclient -o nwarp nwarp.o nw_standarts.o nw_database.o nw_device.o nw_dev_storage.o -L/usr/lib/ -L/usr/lib/qt3/lib/ - -L/usr/X11R6/lib/ -lqt-mt -lXext -lX11 -lm -lpthread
[...]
Soweit ich das jetzt verstehe, ist in dem File die Deklaration der Templateklasse "nw_queue
" nicht bekannt, Dann hätte sich der Compiler schon viel früher beschwert. Hier wurde ein Konstruktor nicht instanziert, aber warum das so ist, könnte man nur anhand des/der Header(s) und ggfs. des ihn/sie verwendenden Codes beurteilen.
wenn ich das richtig sehe, ist das auch kein Compilefehler sondern ein Linkfehler, d.h. die Bibliothek, die dieses nw_queue bereitstellt wird nicht dazugelinkt... Andreas
Andreas Loesch
Soweit ich das jetzt verstehe, ist in dem File die Deklaration der Templateklasse "nw_queue
" nicht bekannt, Dann hätte sich der Compiler schon viel früher beschwert. Hier wurde ein Konstruktor nicht instanziert, aber warum das so ist, könnte man nur anhand des/der Header(s) und ggfs. des ihn/sie verwendenden Codes beurteilen.
wenn ich das richtig sehe, ist das auch kein Compilefehler sondern ein Linkfehler, d.h. die Bibliothek, die dieses nw_queue bereitstellt wird nicht dazugelinkt...
Ja, der Fehler wird vom Linker gemeldet, aber das muss nicht zwangsläufig heissen, dass da eine Bibliothek fehlt, denn es handelt sich ja um Templates, die ja normalerweise erst bei Bedarf für entsprechende Typen instantiiert werden. Aber Genaueres kann man nur anhand der Header und deines Codes sagen. Philipp
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hmmm,
die Headerdatei wird aber in meinem Code bei "nw_device.h" mit eingebunden.
Ich poste Euch hier mal den Auszug vom Code. Wäre super, wenn da mal jemand
kurz drüberschauen könnte, ich komme leider nicht mehr weiter:
nw_standarts.h => enthält die Deklaration für die Templateklasse nw_queue
...
// Queue:
template <class T> class nw_queue
{
private:
int next; // Offset auf das nächste, freie Element
int current; // Offset auf das aktuell zu lesende Element
int max; // Obergrenze, ab der wieder bei 0 angefangen wird
T* queue; // Adresse auf Element-Vektor
nw_action_result status; // Status der Queue
void free_queue(); // interne Routine zum Freigeben der Queue
public:
// Konstruktoren und Destruktoren
nw_queue(int );
nw_queue(const nw_queue<T> &);
~nw_queue() { if (queue) free_queue();}
// Operatoren
nw_queue<T> & operator=(const nw_queue<T> & );
// weitere Funktionen
T* Get() const; // GET-Methode der Queue
nw_action_result Put(const T*); // PUT-Methode der Queue
int Count()
{
int count=(next<=current)?(next+max)-current:next-(current+1);
return count; // COUNT-Methode
};
nw_action_result Status() const {return status;}
int freeClasses(void);
};
...
nw_standarts.cpp => Implementierung von nw_queue
// NW_QUEUE
template<class T> nw_queue<T>::nw_queue(int top):max(top), next(0),
current(0), status(NW_ACTION_OK)
{
queue = new T*[max];
}
template<class T> nw_queue<T>::nw_queue(const nw_queue<T> &
srcqueue):max(srcqueue.max), next(srcqueue.next), current(srcqueue.current),
status(srcqueue.status)
{
queue = new T*[max];
int i;
for (i=0;i
Udo Gerhards
nw_standarts.h => enthält die Deklaration für die Templateklasse nw_queue nw_standarts.cpp => Implementierung von nw_queue
Und werden *beide* in dem Code eingebunden, der nw_standarts.h verwendet? Ansonsten funktioniert das bei Templates nicht! Zum Zeitpunkt der Instantiierung *muss* der Compiler den kompletten Code kennen. Also entweder den Code aus nw_standarts.cpp in nw_standarts.h integrieren oder aber nw_stadarts.cpp in nw_standarts.h mittels #include einbinden. BTW, der C++-Standard sieht zwar zur Lösung dieses Problems das neue Schlüsselwort 'export' vor, dieses wird aber derzeit vom gcc nicht unterstützt. Philipp
* Philipp Thomas
BTW, der C++-Standard sieht zwar zur Lösung dieses Problems das neue Schlüsselwort 'export' vor, dieses wird aber derzeit vom gcc nicht unterstützt.
ist das eigentlich in Arbeit? Gruß, Bernhard -- "Demokratie heißt, sich in die eigenen Angelegenheiten einmischen." -- Max Frisch
* Philipp Thomas
Bernhard Walle
[Wed, 6 Oct 2004 16:03:35 +0200]: ist das eigentlich in Arbeit?
Nein, bisher hat sich niemand gefunden, der das Problem angehen will :(
Hm, beschäftigt SuSE nicht g++ Entwickler? ;) Gruß, Bernhard -- "If you put your mind to it...you can do anything." -- Jono Bacon
participants (5)
-
Andreas Loesch
-
Bernhard Walle
-
Philipp Thomas
-
Philipp Thomas
-
Udo Gerhards