Undefined reference to .. Problem

Alles zu Entwicklungsumgebungen und Editoren für Qt
Antworten
NMO
Beiträge: 7
Registriert: 23. September 2011 01:12

Undefined reference to .. Problem

Beitrag von NMO »

Hi,

ich verwende Eclipse Indigo zusammen mit dem Qt Plugin.
Ich habe eine Qt Application mit einem Widget, das so aussieht:

Code: Alles auswählen

/*
 * GLWidget.h
 *
 *  Created on: Sep 22, 2011
 *      Author: martin
 */

#ifndef GLWIDGET_H_
#define GLWIDGET_H_
#include <QGLWidget>
#include "GraphicSystem.h"
class GLWidget : public QGLWidget, public GraphicSystem {
public:
	GLWidget(QWidget *parent);
	virtual void render();
	//virtual ~GLWidget();
protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
};

#endif /* GLWIDGET_H_ */
Die Klasse GraphicSystem ist Teil von einem anderen C++ Projekt. Dieses Projekt habe ich zum Build Path hinzugefügt. trotzdem bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

make debug 
make -f Makefile.Debug
make[1]: Entering directory `/home/martin/workspace/IntersectionTesting_QTGUI'
g++ -Wl,-rpath,/home/martin/QtSDK/Desktop/Qt/474/gcc/lib -o IntersectionTesting_QTGUI debug/GLWidget.o debug/main.o debug/intersectiontesting_qtgui.o debug/moc_intersectiontesting_qtgui.o    -L/home/martin/QtSDK/Desktop/Qt/474/gcc/lib -L/usr/X11R6/lib -lQtOpenGL -lQtGui -lQtCore -lGLU -lGL -lpthread 
debug/GLWidget.o: In function `GraphicSystem':
make[1]: Leaving directory `/home/martin/workspace/IntersectionTesting_QTGUI'
/home/martin/workspace/IntersectionTesting_QTGUI/../IntersectionTesting/src/GraphicSystem.h:11: undefined reference to `WorldChangedModel::WorldChangedModel()'
collect2: ld returned 1 exit status
make[1]: *** [IntersectionTesting_QTGUI] Error 1
make: *** [debug] Error 2
Was mache ich falsch?
ichbinsisyphos
Beiträge: 24
Registriert: 4. Mai 2010 16:00

Re: Undefined reference to .. Problem

Beitrag von ichbinsisyphos »

WorldChangedModel::WorldChangedModel()
Tja, was ist das? Wo sollte das sein?
NMO
Beiträge: 7
Registriert: 23. September 2011 01:12

Re: Undefined reference to .. Problem

Beitrag von NMO »

Code: Alles auswählen

Tja, was ist das? Wo sollte das sein?
Sorry, das habe ich vergessen zu erwähnen. :)
Die Klassendefinition von GraphicSystem schaut also folgendermaßen aus:

Code: Alles auswählen

#ifndef GRAPHICSYSTEM_H_
#define GRAPHICSYSTEM_H_
#include "WorldChangedModel.h"
class GraphicSystem {
public:
//	GraphicSystem();
//	virtual ~GraphicSystem();
	virtual void render() = 0;
protected:
	WorldChangedModel worldChangedModel;
};

#endif /* GRAPHICSYSTEM_H_ */
Hier wird also eine Instanz von worldChangedModel erzeugt.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Undefined reference to .. Problem

Beitrag von Christian81 »

Was upsala meinte - wo ist denn nun der ctor von WorldChangedModel ??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
NMO
Beiträge: 7
Registriert: 23. September 2011 01:12

Re: Undefined reference to .. Problem

Beitrag von NMO »

Danke schon mal für eure antworten.
Ich probier das etwas ausführlicher zu erklären:
Ich habe neben meinem Qt Projekt noch ein anderes Eclipse CDT Projekt. Diese Projekt hat keine GUI. Deswegen möchte ich für dieses Projekt jetzt eine GUI mittels Qt basteln. In diesem "GUI-losen" Projekt befindet sich unter anderem die Klassen GraphicSystem und WorldChangedModel. In meinem Qt Projekt habe ich eine Klasse GLWidget, die wie oben gezeigt von GraphicSystem ableitet. Jedoch schreit der Linker, dass er den Konstruktor von WorldChangedModel nicht findet, wenn ich mein Qt Projekt ausführe.

Vielleicht noch die Klassendefinition von WorldChangedModel:

Code: Alles auswählen

#ifndef WORLDCHANGEDMODEL_H_
#define WORLDCHANGEDMODEL_H_
#include "WorldChangedListener.h"
#include <vector>
using namespace std;

class WorldChangedModel {
public:
	WorldChangedModel();
	void addWorldChangedListener(WorldChangedListener* l);
	void removeWorldChangedListener(WorldChangedListener* l);
	void objectSelected(int id, bool selected);
	void objectTranslated(int objectId, Vector3f* translation);
private:
	vector<WorldChangedListener*> worldChangedListenerList;
};
#endif /* WORLDCHANGEDMODEL_H_ */
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Undefined reference to .. Problem

Beitrag von Christian81 »

Ok es reicht. Wir haben den ctor immer noch nicht gesehen :roll:
Also entweder lieferst Du uns ein minimales, kompilierbares Beispiel oder wir können dir nicht helfen!

/edit: Windows? Wenn ja -> Q_DECL_EXPORT/Q_DECL_IMPORT z.B. hier: http://www.qtforum.de/forum/viewtopic.php?t=3738 oder google ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
NMO
Beiträge: 7
Registriert: 23. September 2011 01:12

Re: Undefined reference to .. Problem

Beitrag von NMO »

Ok es reicht. Wir haben den ctor immer noch nicht gesehen :roll:
Sorry, aber erstens wurde gefragt WO der Konstruktor von WorldChangedModel ist und nicht wie er aussieht und zweitens ist der Konstruktor ohnehin leer. Bei mir meckert der Linker, nicht der Compiler.


Also entweder lieferst Du uns ein minimales, kompilierbares Beispiel oder wir können dir nicht helfen!
Ich wollte ein Beispiel als Dateianhang uploaden, aber ich kann maximal 256 KiB uploaden, da hat kein Qt Projekt platz.
Jedoch lässt sich mein Problem auf jedem Rechner ganz einfach nachvollziehen: In Eclipse ein bestehendes Qt Projekt nehmen oder ein neues anlegen und dann eine beliebige Header-Datei, die eine Klasse enthält aus einem ANDEREN CDT Projekt einbinden.
Beispiel:
Wenn es also eine Klasse A in einer Headerdatei A.h gibt (A.h und A.cpp befinden sich in einem beliebigen C++ Projekt), dann diese Headerdatei mittels #include in ein Qt Projekt einbinden. Wie gesagt muss sich A.h in einem anderen C++ Projekt befinden.

A.h könnte so aussehen:

Code: Alles auswählen

#ifndef A_H_
#define A_H_
#include "B.h"
#include "testclass.h"
class A {
public:
	A();
	virtual ~A();
};

#endif /* A_H_ */
A.cpp könnte so aussehen;:

Code: Alles auswählen

#include "A.h"

A::A() {
	// TODO Auto-generated constructor stub

}

A::~A() {
	// TODO Auto-generated destructor stub
}
Daraufhin wird der Linker folgendes ausgeben:
workspace/test/x.cpp:10: undefined reference to `A::A()'
workspace/test/x.cpp:15: undefined reference to `A::~A()'

Wenn ich was unklar beschrieben habe bitte melden.
Windows? Wenn ja -> Q_DECL_EXPORT/Q_DECL_IMPORT z.B. hier: http://www.qtforum.de/forum/viewtopic.php?t=3738 oder google ...
Ne Linux.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Undefined reference to .. Problem

Beitrag von Christian81 »

Du musst natürlich auch gegen die andere Library linken...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
NMO
Beiträge: 7
Registriert: 23. September 2011 01:12

Re: Undefined reference to .. Problem

Beitrag von NMO »

Und wenn ich keine Library zur Verfügung habe gegen die ich linken könnte? Muss ich vorher selber eine Library basteln? Weil Eclipse macht das nicht für mich.
Ich meine woher sollte ich eine Library bekommen gegen die ich linken könnte?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Undefined reference to .. Problem

Beitrag von Christian81 »

Von allein wird es sicherlich nicht gehen - wie sollte sowas aussehen? Du musst schon eine Library bauen oder die Sourcen direkt mit compilieren...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ichbinsisyphos
Beiträge: 24
Registriert: 4. Mai 2010 16:00

Re: Undefined reference to .. Problem

Beitrag von ichbinsisyphos »

Ich glaub er stellt sich zumindest vor, dass das dann mitkompiliert wird. Ich hab keine Erfahrung mit Eclipse. In Code::Blocks z.B. funktioniert das allerdings wirklich so, man fügt ein externes Projekt komplett mit headers und sourcen ein , das scheint als Unterordner im Baum auf und wird mitkompiliert.

Keine Ahnung, irgendwie findet er die sourcen nicht, oder er erwartet fertige binaries zum Linken.

Am besten du fragst auf einem Eclipse-spezifischen Forum, falls es sowas gibt.
NMO
Beiträge: 7
Registriert: 23. September 2011 01:12

Re: Undefined reference to .. Problem

Beitrag von NMO »

Die Lösung zu meinem Problem war ganz einfach:

Das Qt Plugin legt zwei Makefiles an: Makefile.Debug und Makefile.Release
Die Pfade zu den Object-Files, die dazu gelinkt werden, müssen einfach in einen der zwei Makefiles hinzugefügt werden.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Undefined reference to .. Problem

Beitrag von Christian81 »

Das ist aber nicht wirklich sinnvoll - aber egal.
Entweder Du kompilierst die Sourcen direkt mit im Projekt oder eine statische/dynamische lib und linkt dagegen. alles andere ist ein Hack.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
NMO
Beiträge: 7
Registriert: 23. September 2011 01:12

Re: Undefined reference to .. Problem

Beitrag von NMO »

Das ist aber nicht wirklich sinnvoll - aber egal.
Ne egal ist das natürlich nicht. Wenn du sagst dass es nicht sinnvoll ist, dann werd ichs zu gegebener Zeit ändern.
Ich werds jetzt mal so lassen. Sobald mein Projekt wachsen wird, werde ichs mit einer Library probieren.
Danke für die Hilfe!
Antworten