Seite 1 von 1
Undefined reference to .. Problem
Verfasst: 26. September 2011 02:30
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?
Re: Undefined reference to .. Problem
Verfasst: 26. September 2011 04:56
von ichbinsisyphos
WorldChangedModel::WorldChangedModel()
Tja, was ist das? Wo sollte das sein?
Re: Undefined reference to .. Problem
Verfasst: 26. September 2011 13:10
von NMO
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.
Re: Undefined reference to .. Problem
Verfasst: 26. September 2011 17:59
von Christian81
Was upsala meinte - wo ist denn nun der ctor von WorldChangedModel ??
Re: Undefined reference to .. Problem
Verfasst: 26. September 2011 23:23
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_ */
Re: Undefined reference to .. Problem
Verfasst: 27. September 2011 06:31
von Christian81
Ok es reicht. Wir haben den ctor immer noch nicht gesehen
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 ...
Re: Undefined reference to .. Problem
Verfasst: 27. September 2011 21:06
von NMO
Ok es reicht. Wir haben den ctor immer noch nicht gesehen
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.
Ne Linux.
Re: Undefined reference to .. Problem
Verfasst: 28. September 2011 06:37
von Christian81
Du musst natürlich auch gegen die andere Library linken...
Re: Undefined reference to .. Problem
Verfasst: 28. September 2011 11:52
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?
Re: Undefined reference to .. Problem
Verfasst: 28. September 2011 12:01
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...
Re: Undefined reference to .. Problem
Verfasst: 28. September 2011 12:44
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.
Re: Undefined reference to .. Problem
Verfasst: 29. September 2011 00:11
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.
Re: Undefined reference to .. Problem
Verfasst: 29. September 2011 06:38
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.
Re: Undefined reference to .. Problem
Verfasst: 29. September 2011 13:45
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!