QtCreator: undefined reference to ...
QtCreator: undefined reference to ...
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.
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.
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: QtCreator: undefined reference to ...
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
Siehe http://doc.trolltech.com/4.7/qmake-vari ... .html#libs
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: QtCreator: undefined reference to ...
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
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: QtCreator: undefined reference to ...
Wie wäre es dann mit Code und den Fehlermeldungen? Wir haben keine Glaskugel hier.
Am sinnvollsten ein minimales programmierbares Beispiel.
Am sinnvollsten ein minimales programmierbares Beispiel.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: QtCreator: undefined reference to ...
ich schau mal ob ich es auf wenig zeugs reduzieren kann ... to be continued
Re: QtCreator: undefined reference to ...
also ich konnte es mit folgendem beispiel rekonstruieren:
main.cpp:
foo.h:
foo.cpp:
Foo.pro:
und ich sehe nicht das problem ...
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();
}
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
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
Code: Alles auswählen
SOURCES += \
main.cpp \
../../src/Foo/foo.cpp
HEADERS += \
../../src/Foo/foo.h
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: QtCreator: undefined reference to ...
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.
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
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: QtCreator: undefined reference to ...
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()'
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()'
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: QtCreator: undefined reference to ...
Was soll das Ganze mit dem '_IG_foo_template_IG_'?? Warum inkludierst Du in einem Header eine Source-Datei?
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.
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
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: QtCreator: undefined reference to ...
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.
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.
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: QtCreator: undefined reference to ...
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...
Mache es richtig und es geht - templates gehören in den Header...
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: QtCreator: undefined reference to ...
das prinzip ist letztlich immer folgenden bei meinen datei die nur partiell aus templates bestehen
HEADER foo.h
SOURCE foo.cpp
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
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 ...
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.
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: QtCreator: undefined reference to ...
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.
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
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: QtCreator: undefined reference to ...
deleted
Zuletzt geändert von FreakyBKA am 24. Juli 2011 12:09, insgesamt 1-mal geändert.