QtCreator: undefined reference to ...

Du bist neu in der Welt von C++? Dann schau hier herein!
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

Hallo,
also arbeite gerade daran für ein C++/OpenGL Programm eine Oberfläche in Qt zu basteln. Ich habe alle meine Header und Source Dateien dem Projekt hinzugefügt, ebenso die erstelleten *.ui-Dateien mit den zugehörigen *.h und *.cpp-Dateien. Desweiteren hab ich in der .pro-datei noch

QT += opengl

und

unix:!macx:!symbian|win32: LIBS += -L$$PWD/../../../OpenGL/lib/ -lglut32
win32: PRE_TARGETDEPS += $$PWD/../../../OpenGL/lib/glut32.lib
else:unix:!macx:!symbian: PRE_TARGETDEPS += $$PWD/../../../OpenGL/lib/libglut32.a

eingefügt, damit mein OpenGL-Krams funkioniert. Das scheint aberr akutell alles noch kein Problem zu sein, sondern ehr, das er meine viele meiner alten Dateien nicht kompilieren kann, da er haufen "undefined references ..." findet, die ich mir aber nicht erklären kann.
Die Dateien includieren allerdings alle Header mit den entsprechenden Funktionen, so dass sie eigentlich bekannt sein müssten und in der .pro-Datei stehen sie auch alle drin. Kurz gesagt ich versteh nciht wo das Problem ist und brauche dringend Hilfe, da ich nahezu am verzweifeln bin.Danke schonmal im Voraus.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QtCreator: undefined reference to ...

Beitrag von Christian81 »

Undefined references haben nichts mit dem Compiler zu tun sondern mit dem Linker. Und wenn Du dem Linker nicht sagst gegen welche Libraries er linken soll kann er dann die Symbol auch nicht auflösen.
Siehe http://doc.trolltech.com/4.7/qmake-vari ... .html#libs
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

er meckert ja nicht bei methoden von anderen libs, sondern bei methoden von meinen eigenen klassen. bei den include und sources hab ichd ie aber alle angegeben, daher weiß ich nciht wo das problem ist. jedenfalls hab ich da keine .lib-datei, da ich auch nicht mal weiß wie man so eine erstellt :(
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QtCreator: undefined reference to ...

Beitrag von Christian81 »

Wie wäre es dann mit Code und den Fehlermeldungen? Wir haben keine Glaskugel hier.
Am sinnvollsten ein minimales programmierbares Beispiel.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

ich schau mal ob ich es auf wenig zeugs reduzieren kann ... to be continued
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

also ich konnte es mit folgendem beispiel rekonstruieren:

main.cpp:

Code: Alles auswählen

#include "../../src/Foo/foo.h"

int main(int argc, char *argv[])
{
	cfoo f(1);
	f.output<double>(2.25);
	return f.get_a();
}
foo.h:

Code: Alles auswählen

#ifndef FOO_H
#define FOO_H

#include <iostream>

class cfoo
{
	private:
		int _a;
	public:
		cfoo(int a = 0);
		cfoo(cfoo const &src);
		virtual ~cfoo();
		int const &get_a() const;
		template<class t>
		void output(t const &src);
};

#ifndef _IG_foo_template_IG_
#define _IG_foo_template_IG_
#include "foo.cpp"
#undef _IG_foo_template_IG_
#endif

#endif // FOO_H
foo.cpp:

Code: Alles auswählen

#ifndef FOO_CPP
#define FOO_CPP

#include "foo.h"

#ifndef _IG_foo_template_IG_

cfoo::cfoo(int a/* = 0*/) :
	_a(a)
{}

cfoo::cfoo(cfoo const &src) :
	_a(src._a)
{}

cfoo::~cfoo()
{
	std::cout << _a << std::endl;
}

int const &cfoo::get_a() const
{
	return _a;
}

#endif

template<class t>
void cfoo::output(t const &src)
{
	std::cout << src << std::endl;
}

#endif // FOO_CPP
Foo.pro:

Code: Alles auswählen

SOURCES += \
    main.cpp \
    ../../src/Foo/foo.cpp

HEADERS += \
    ../../src/Foo/foo.h
und ich sehe nicht das problem ...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QtCreator: undefined reference to ...

Beitrag von Christian81 »

Und die dazugehörige Fehlermeldung?
Abgesehen davon - nur weil man ein template definiert heißt es nicht dass der Compiler automatisch alle Varianten davon erzeugt... also wo ist template<double> void output(t const &src); implementiert?
--> C++ Grundlagen

Schieb die Implementation der template-Funktion in den Header und schon weiß der Compiler was Du willst.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

wo ist der sinn von templates wenn ich es fürjeden typen dann doch wieder implementieren müsste. meines wissens nach werden funktionen mit den entsprechenden template-parameter (in diesem fall double) automatisch beim erstellen erzeugt, da es ja eine allgemeine defnition gibt, die in foo.cpp definiert und in foo.h inkludiert wird.

Die Fehler sind:
main.cpp:5: Fehler:undefined reference to `cfoo::cfoo(int)'
main.cpp:7: Fehler:undefined reference to `cfoo::get_a() const'
main.cpp:7: Fehler:undefined reference to `cfoo::~cfoo()'
main.cpp:7: Fehler:undefined reference to `cfoo::~cfoo()'
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QtCreator: undefined reference to ...

Beitrag von Christian81 »

Was soll das Ganze mit dem '_IG_foo_template_IG_'?? Warum inkludierst Du in einem Header eine Source-Datei? :shock:
Nimmer den ganzen Müll raus, ruf qmake nochmal auf und dann bekommst Du nur den Fehler das 'cfoo::output<double>(double const &)' nicht gefunden werden kann was korrekt ist da sie nirgends instanziiert wird. Also die Template-Funktion in den Header da wo sie hingehört und alles ist gut.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

wenn du dir die foo.cpp anschaust siehst du, dass über '_IG_foo_template_IG_' genau die definition von output eingebunden wird, genau dafür ist es gedacht. ich find es halt übersichtlicher wenn definition in den .cpp und deklarationen in der .h-Datei stehen. Da bei Templates die definitionen aber gleich bekannt sein müssen mache ich das halt über '_IG_foo_template_IG_' wodurch bei mir nur die definitionen von template-funktionen inkludiert werden, siehe 'foo.cpp'. bei anderen IDE wie Code::Blocks funktioniert das auch so, nur QtCreator spinnt irgendwie rum.
Mal abgesehen davon meckert er wiegesagt nicht an dem 'f.output<double>()' rum, sondern daran das angeblich die anderen methoden nicht definiert sind und eben das kann ich nicht nachvollziehen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QtCreator: undefined reference to ...

Beitrag von Christian81 »

qmake ist a dieser Stelle aber so intelligent und erkennt dass die foo.cpp direkt eingebunden wird und lässt deshalb das Compilieren der foo.cpp weg.
Mache es richtig und es geht - templates gehören in den Header... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

das prinzip ist letztlich immer folgenden bei meinen datei die nur partiell aus templates bestehen

HEADER foo.h

Code: Alles auswählen

#ifndef includeguard_for_header
#define includeguard_for_header

class foo
{
    //methoden
    //templatemethoden
}

#ifndef includeguard_for_template
#define includeguard_for_template
#include "foo.cpp"
#undef includeguard_for_template
#endif

#endif
SOURCE foo.cpp

Code: Alles auswählen

#ifndef includeguard_for_source
#define includeguard_for_source

#ifndef includeguard_for_template
//methoden
//wird durch includeguard_for_template nur für den fall des inkludieren aus dem header übersprungen
#endif

//templatemethoden
#endif
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

heißt das etwa, nur weil die inkludierte datei ein ".cpp" am ende hat ignoriert QtCreator die Datei? Was ist denn dein Vorschlag bei Templates Defintionen und Deklarationen optisch von einander zu trennen, da es den Quelltext, dann arg unübersichtlich macht. Desweiteren frage ich mich warum Code::Blocks diese Probleme nicht hat und da verwende ich den GNU-GCC Compiler, also sehr nahe am C/C++-Standard, meines Wissens nach.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QtCreator: undefined reference to ...

Beitrag von Christian81 »

Was hat das Erzeugen von Makefiles mit C++ zu tun? qmake ist an der Stelle nunmal so pingelig.
Und was machst Du wenn die Library installiert wird? Installierst Du die Source-Datei auch mit in den include-Ordner? - Anders würde man Deine Libraray ja nicht benutzen kölnnen. Das Vorgehen ist einfach Müll - Templates gehören in den Header und fertig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FreakyBKA
Beiträge: 26
Registriert: 3. März 2008 09:57

Re: QtCreator: undefined reference to ...

Beitrag von FreakyBKA »

deleted
Zuletzt geändert von FreakyBKA am 24. Juli 2011 12:09, insgesamt 1-mal geändert.
Antworten