Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

05.08.2014, 16:10

Überladene Operatoren in static library

Guten Tag zusammen,
ich habe folgendes Problem: Ich erstelle eine statische Bibliothek, die mehrere Klassen und einige Operatoren enthält. Eine Klasse ist zum Beispiel Vector und ein Operator ist +(Vector a, Vector b). In einem anderen Projekt binde ich diese Bibliothek ein, was soweit gut funktioniert. Ich kann alle Klassen aus der Bibliothek benutzen, aber sobald ich einen Operator nutzen möchte, bekomme ich einen Fehler "undefinded reference to operator...". Ich benutze Eclipse CDT mit MinGW. Ich habe keine Ahnung warum er die Operatoren nicht findet, habe schon mit extern "C" und extern "C++" rumprobiert, was aber nichts gebraucht hat. Ich habe außerdem versucht eine "normale" Funktion (also keinen Operator und keine Klasse) aus der Bibliothek zu nutzen, was auch funktioniert hat. Ein operator ist doch nichts anderes als ne Funktion oder sehe ich das falsch?

Viele Grüße

newby

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

05.08.2014, 16:38

"Undefined reference" besagt, dass er die Funktionsdeklaration wohl gefunden hat, aber nicht die Definition. Hast Du die Implementation evtl. inline in einem anderen Header? Den musst Du dann natürlich auch inkludieren, inline-Funktionen tauchen nicht beim Linken auf.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

05.08.2014, 16:51

Danke für die Antwort. Die Definition befindet sich in einer cpp Datei und ist nicht inline (zumindest nicht explizit von mir gekennzeichnet). Im Header befindet sich nur die Dekleration der Operator Funktion. Das ganze sieht so aus:

Vector.h

C-/C++-Quelltext

1
2
3
4
namespace Simple2D {
class Vector {...};
Vector operator+(const Vector& a, const Vector& b);
}


Vector.cpp

C-/C++-Quelltext

1
2
3
Vector operator+(const Vector& a, const Vector& b) {
    return Vector(a.getX()+b.getX(), a.getY()+b.getY());
}


Im Hauptprogramm dann einfach

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#include "Simple2D.h"
using namespace Simple2D;

int main() {
    Vector a(3, 3);
    Vector b(2, 2);
    a = a+b;
    std::cout<<a.toString();
}


Warum findet er die Klasse Vector, aber nicht den Operator, der sogar in der selben Headerdatei deklariert wird und in der selben Cppdatei definiert wird :huh:

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

05.08.2014, 17:11

Eine Klassen-Definition erzeugt erstmal keinen Code :-) Also nur anhand dieser drei Code-Schnipsel geschlussfolgert: es kann auch sein, dass der einfach gar nix aus Vector.cpp findet.

Benutzt Du Visual Studio? Bist Du wirklich sicher, dass das Projekt eine statisch gelinkte Lib ist? Falls ja, kann es noch sein, dass Du in Deinem Hauptprogramm die Lib als Abhängigkeit eintragen musst. Bei Libs in der selben Solution geht das wie folgt: Kontextmenü des Hauptprojekts -> "Projekteigenschaften" -> Links der Tab "Allgemeine Eigenschaften" -> Unterpunkt "Verweise" -> Unten der Button "Neuen Verweis hinzufügen". Gilt automatisch für alle Build-Konfigs. Visual Studio baut dann automatisch das Lib-Projekt zuerst und linkt dann automatisch gegen die Lib, die bei dem Projekt rausgekommen ist.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

5

05.08.2014, 17:29

Ich hatte vermutet, dass das funktioniert, weil ich ja wie gesagt schon eine "normale" Funktion aus der lib benutzt. Ich benutze Eclipse und habe das Projekt definitiv als statische lib erzeugt. Auch eine Abhängigkeit habe ich in den Projekteinstellungen eingetragen und die lib Datei als externe Bibliothek eingetragen. Es funktioniert ja auch alles, nur eben die operator funktionen nicht.. Bei Bedarf könnte ich auch etwas mehr Code posten, wenn jemand Lust hat sich das anzutun. Ich vermute aber eher das es an irgendwelchen Projekteinstellungen liegt, weil ich Eclipse CDT heute zum ersten Mal nutze.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

05.08.2014, 17:38

Bei Eclipse kann ich Dir leider gar nicht helfen. Falls nicht jemand anders eine Idee hat, musst Du wirklich mal mehr Code posten. Oder Deinen Code reduzieren, bis Du ein minmales Fehler-Beispiel hast.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

7

05.08.2014, 18:11

Ich arbeite nicht mit Eclipse, aber dennoch Brainstorming:
  • C++ Name mangling: http://stackoverflow.com/questions/18877…ary-with-c-code
  • Du nutzt in der Vector.cpp keinen namespace, bzw. nutzt using namespace Simple2D; anstelle von namespace Simple2D { operator() {...} } in Vector.cpp
  • Die lib wurde nicht richtig erstellt oder eine alte version gecached / benutzt. Diagnose: Füge eine neue andere Funktion hinzu und versuche auf diese zu zugreifen

Lösen wirst du das definitv können, indem du die Definition deines Operators in die header packst.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »iSmokiieZz« (05.08.2014, 18:25)


8

05.08.2014, 22:03

Das es sich beim überladen des Operators um eine freie Funktion handelt und nicht Teil der Klasse ist hast du diese Funktion separat exportiert in die Lib?

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

9

06.08.2014, 14:14

Vielen Dank für die Hilfe, Smokii hat Recht gehabt mit einem Vorschlag. Die Dekleration der Klassen und Operatoren waren zwar von namespace umgeben, die Definitionen jedoch nicht. Mir war nicht klar, dass ich auch in der Vector.cpp alle Funktionen damit umschließen muss. Macht aber Sinn, woher soll der Compiler sonst wissen, dass ich nicht die Funktion im default-namespace definieren möchte ;) Danke nochmal, wäre selber wahrscheinlich nie darauf gekommen.

10

06.08.2014, 20:05

Vielen Dank für die Hilfe, Smokii hat Recht gehabt mit einem Vorschlag. Die Deklaration der Klassen und Operatoren waren zwar von namespace umgeben, die Definitionen jedoch nicht. Mir war nicht klar, dass ich auch in der Vector.cpp alle Funktionen damit umschließen muss. Macht aber Sinn, woher soll der Compiler sonst wissen, dass ich nicht die Funktion im default-namespace definieren möchte ;) Danke nochmal, wäre selber wahrscheinlich nie darauf gekommen.


Ich meine das VC das gar nicht kompilieren würde (ja ich weiß du nutzt Eclipse).

Mal noch an die alten Hasen (weil es mich gerade Interessiert).
Ist das ein muß

C-/C++-Quelltext

1
namespace XYZ {bla bla}
für die .cpp Datei wenn man das ganze in lib exportieren möchte?

Oder funktioniert hier auch

C-/C++-Quelltext

1
using namespace XYZ
oder

C-/C++-Quelltext

1
void XYZ::Klasse::Funktion()
zu benutzen in der .cpp Datei.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige