Seite 1 von 2

QtCreator: undefined reference to ...

Verfasst: 21. Juli 2011 13:47
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.

Re: QtCreator: undefined reference to ...

Verfasst: 21. Juli 2011 17:43
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

Re: QtCreator: undefined reference to ...

Verfasst: 22. Juli 2011 20:34
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 :(

Re: QtCreator: undefined reference to ...

Verfasst: 22. Juli 2011 20:49
von Christian81
Wie wäre es dann mit Code und den Fehlermeldungen? Wir haben keine Glaskugel hier.
Am sinnvollsten ein minimales programmierbares Beispiel.

Re: QtCreator: undefined reference to ...

Verfasst: 23. Juli 2011 10:32
von FreakyBKA
ich schau mal ob ich es auf wenig zeugs reduzieren kann ... to be continued

Re: QtCreator: undefined reference to ...

Verfasst: 23. Juli 2011 13:00
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 ...

Re: QtCreator: undefined reference to ...

Verfasst: 23. Juli 2011 13:30
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.

Re: QtCreator: undefined reference to ...

Verfasst: 23. Juli 2011 18:32
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()'

Re: QtCreator: undefined reference to ...

Verfasst: 24. Juli 2011 10:04
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.

Re: QtCreator: undefined reference to ...

Verfasst: 24. Juli 2011 10:22
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.

Re: QtCreator: undefined reference to ...

Verfasst: 24. Juli 2011 10:25
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:

Re: QtCreator: undefined reference to ...

Verfasst: 24. Juli 2011 10:33
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

Re: QtCreator: undefined reference to ...

Verfasst: 24. Juli 2011 11:11
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.

Re: QtCreator: undefined reference to ...

Verfasst: 24. Juli 2011 11:15
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.

Re: QtCreator: undefined reference to ...

Verfasst: 24. Juli 2011 11:20
von FreakyBKA
deleted