Linkerfehler den ich nicht verstehe ...

Frogger

Grünschnabel
Hallo

Ich arbeite im Moment an einem Programm mit C++ und QT. (Zum Compilieren benutze ich das NMAKE kommando von qmake.)
Ich bekomme einen Linkerfehler den ich mir nicht erklären kann:

Picwidget.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall PictureData::~PictureData(void)" (1PictureData@@QAE@XZ)
Segmentierer.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise NMAKE : fatal error U1077: 'link' :Rueckgabe-Code '0x460'


Das Problem hängt irgendwie mit meinen Klassen "Picwidget" und "PictureData" zusammen. Wie unten in den Quelltextausschnitten dargestellt ist der Destruktor von "PictureData" den der Linker anmeckert sowohl in der Headerdatei "PictureData.h" definiert als auch in "PictureData.cxx" implementiert. Eine andere Klasse "PicWidget" hat als Attribut einen Zeiger auf eine Instanz von "PictureData" und muss diese in ihrem destruktor löschen. Was ich herausgefunden habe ist, daß der Fehler nicht auftritt wenn ich den "delete picDataPtr;" im Destruktor der Picwidget Klasse weglasse. Und genau das verstehe ich nicht.
Welches Problem hat der Linker mit dem Destruktor der Klasse "PictureData" wenn ich in einer anderen Klasse eine Instanz davon lösche ? Außedem kennt die PicWidget-Klasse doch über ihre Headerdatei auch die PictureData-Klasse und müsste beim delete-Befehl deren Destruktor aufrufen können. Was geht hier schief ?
Würde mich freuen wenn mir jemand damit helfen könnte. Details zum Quelltext:


Die Headerdatei "PictureData.h" sieht so aus:


#ifndef PICDATA_H
#define PICDATA_H

#include <qpicture.h>

class PictureData
{

private:
QImage* currentImage;

public:
PictureData();
~PictureData();
PictureData(QImage* initial);

void setImage(QImage* img);
QImage* getImage();

};

#endif


Die Implementierung des Destruktors in "PictureData.cxx":


PictureData::~PictureData()
{
if(!currentImage->isNull())
{
delete currentImage;
}
}



Die Headerdatei "Picwidget.h" sieht so aus:


#ifndef PICWIDGET_H
#define PICWIDGET_H

#include <qwidget.h>
#include "PictureData.h"

class PicWidget: public QWidget
{
Q_OBJECT

private:
PictureData* picDataPtr;

public:
PicWidget( QWidget *parent=0, const char *name=0 );
~PicWidget();

void setPicDataPtr(PictureData* picData);
PictureData* getPicDataPtr();
void drawContent();

public slots:
void loadFile();
};

#endif


Implementierung des Destruktors in "Picwidget.cxx":


PicWidget::~PicWidget()
{
if(picDataPtr)
{
delete picDataPtr; //warum Linkerfehler mit dieser Zeile?
picDataPtr = NULL;
}
}
 
Hallo,
wenn du delete aufrufst wird der dazugehörige Destruktor aufgerufen...

Bei dir ist es nun vermutlich so das die "Implementation" des Destruktors nicht mit dazugelinkt wird...

Du musst also PictureData.obj mit dazulinken, dann sollte es eigentlich funktionieren...

Wie schaut denn dein zugehöriges Makefile aus?

Gruß

RedWing
 
Problem gelöst

Hallo Redwing

Danke, Deine Antwort hat mich auf die richtige Idee gebracht: nämlich daß der Fehler nicht im Quelltext lag.
Am Makefile lag es aber auch nicht (das lasse ich mir von qmake automatisch erstellen und ist mit ca. 6 kB auch ein bischen groß um den Inhalt hier zu posten),aber es lag an der Projektdatei. Die "PictureData" Klasse ist neu in meinem Programm und hätte in die ".pro" Datei eingetragen werden müssen, das hatte ich vergessen.
Ich habe die Projektdatei jetzt von qmake neu erstellen lassen und das Problem ist behoben, im Moment keine Fehlermeldung mehr.

Ich sollte mir dann wohl angewöhnen mit qmake nach jeder größeren Änderung des Programms folgende 3 Schritte erneut durchzuführen (für alle die mal auf dasselbe Problem stoßen):

1. Projektdatei neu erstellen mit dem Aufruf

qmake -project

2. Makedatei neu erstellen mit

qmake -o Makefile

3. Kompilieren, geht unter Windows mit dem Aufruf

nmake
 
Zurück