Frage

Ich habe eine Header-Datei in einer Bibliothek (alibrary.lib). Die Bibliothek ist eine statische Bibliothek (LIB) und verbindet richtig exe.

Nun, ich habe eine Klasse: Vector3D

.
class Vector3d 
{
    void amethod()
    {
       blah
    }

};

Vector3d cross(const Vector3d &v0, const Vector3d &v1) 
{
      float x,y,z;

      x = v0.y*v1.z-v0.z*v1.y;
      y = v0.z*v1.x-v0.x*v1.z;
      z = v0.x*v1.y-v0.y*v1.x;

     return Vector3d(x,y,z);

}

Vector3D deklariert und in einer Header-Datei (Vector3D .h) definiert. Nach der Klassendeklaration ich die Quer Funktion.

Die lib Kompilierung ist Datei, aber wenn es um das Gerät zu testen exe Links bekomme ich diesen Fehler:

 flywindow.obj :error LNK2005: "class Vector3d __cdecl cross(class Vector3d const &,class Vector3d const &)" (?cross@@YA?AVVector3d@@ABV1@0@Z) already defined in fly.obj

Irgendwelche Ideen?

Danke

War es hilfreich?

Lösung

Wenn Sie ein kostenloses (kein Mitglied einer Klasse) Funktion definieren, hat es in einer CPP-Datei separat kompilierte oder in einem Header und markierte inline definiert werden. Also in Ihrem Fall können Sie weg durch diese kompilieren zu machen:

inline Vector3d cross(const Vector3d &v0, const Vector3d &v1) {
      float x,y,z;

      x = v0.y*v1.z-v0.z*v1.y;
      y = v0.z*v1.x-v0.x*v1.z;
      z = v0.x*v1.y-v0.y*v1.x;

     return Vector3d(x,y,z);

}

Der Fehler wird verursacht, weil Sie die Definition der Funktion im Header haben, aber noch nicht inline markiert. Wenn Sie nun diesen Header in zwei Dateien enthalten, die separat kompiliert werden, der Linker, wenn man versucht, die kompilierten Objektdateien zu verknüpfen, wird einen Fehler werfen, denn es sieht dann eine Querfunktion zweimal definiert wird.

Es funktioniert ohne exlicitly inline setzen für Elementfunktionen einer Klasse, weil Elementfunktionen, die innerhalb der Klassendefinition definiert werden implizit inline sind.

Es ist jedoch keine gute Idee im Allgemeinen Funktionsdefinition im Header zu machen. Wenn Ihre Funktion auf andere Arten als nur den Vektor abhängen würde (in Ihrem Fall ist es gut IMHO, aber es ist fraglich, natürlich - einige Leute mögen es nicht), dann würden Sie die Header für diese Typen sind erforderlich zu. Das wird unnötig den Code aufblasen, die von Ihrem Kopf indirekt enthalten sind. Stattdessen wird in diesen Fällen würden Sie allein nur eine Erklärung Ihrer Funktion in der Kopfzeile setzen:

Vector3d cross(const Vector3d &v0, const Vector3d &v1);

Aber definieren es innerhalb der CPP-Datei, die separat kompiliert. Der Inline, natürlich sollte dann fallen gelassen werden.


Lassen Sie mich eine kleine Liste von Definitionen und Erklärungen hinzufügen, nur in helfen, die Dinge klar zu halten, was Deklaration und Definition bedeutet für Funktionen und Klassen. Beachten Sie, dass jede Definition ist auch eine Erklärung, aber nicht umgekehrt:

// class _declaration_ of boo
class boo;

// class _definition_ of foo.
class foo {
    // member function _declaration_ of bar
    void bar();

    // member function _definition_ of baz
    void baz() { }
};

// function _definition_ of fuzz
inline void fuzz() { }

// function _declaration_ of fezz
void fezz();

Andere Tipps

Die wahrscheinlichste Erklärung ist, dass Sie Code haben (insbesondere die Definition von Kreuz) in Ihrer Include-Datei und Ihre Include-Datei von zwei Quelldateien enthalten wird, damit die doppelte Definition.

Header-Dateien sollten Erklärungen in ihnen, keine Definitionen. Erklärungen (syaing, dass etwas existiert) sind Dinge wie typedef die Klassendeklarationen, Enum ist und so weiter.

Definitionen (Sinngebung Dinge thos, die es gibt) Dinge wie Funktionen, varialble Definitionen werden und so weiter.

Ihre Cross-Funktion sollte in der Header-Datei deklariert werden:

Vector3d cross(const Vector3d &v0, const Vector3d &v1);

aber in einer separaten Quelldatei definiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top