VS C++-net: LNK2005
-
Hallo,
nachdem ich nun meine LIB statisch erzeugt habe, bekomme ich bei fast jedem Programm, welches ich mit dieser LIB linke diverse Fehlermeldungen wie:
ctt.lib(tt.obj) : error LNK2005: "ctt ctt::comptt & __cdecl ctt::SetIm(class ctt::comptt &,class ctt::rt const &)" (?SetIm@cxsc@@YAAAVcomptt@1@AAV21@ABVrt@1@@Z) already defined in ex.obj
Woran liegt das?
Gruß
Boris
-
Naja, in der Fehlermeldung steht's ja bereits. Du hast etwas mehrfach definiert.
Sowas entsteht, wenn du zB eine Variable oder Funktion in einer Headerdatei definierst und diese Datei dann in mehreren Quelldateien einbindest. Das wird auch bei dir der Fall sein. Zeig doch einfach mal, wo du "ctt ctt::comptt & __cdecl ctt::SetIm(class ctt::comptt &,class ctt::rt const &)" definiert hast.
-
Def. ist das Ding in der Lib und zwar in der Datei comptt.hpp:
#ifndef COMPTT_HPP #define COMPTT_HPP namespace ctt { class comptt { ..... public: friend comptt & SetIm(comptt &,const rt &); ...... }; } #endif
und ex.cpp wird nur das Headerfile comptt.hpp eingebunden und ein Objekt von comptt erzeugt.
-
Also ich weiss ja nicht wo es definiert ist, in diesem Schnippsel ist es jedenfalls nur deklariert - wo ist die Definition von SetIm denn abgelegt? (Das Teil mit den geschweiften Klammern ;))
-
Ah sorry, ich hatte was ausgelassen:
#ifndef COMPTT_HPP #define COMPTT_HPP namespace ctt { class comptt { ..... public: friend comptt & SetIm(comptt &a,const rt &b) { a.im=b; return a; } ...... }; } #endif
-
Das sollte so funktionieren. Auch wenn die Funktion auf Namensraumebene existiert, ist sie durch da Definition innerhalb der Klasse inline. Somit liegt keine Verletzung der ODR vor. Schon mal einen kompletten Rebuild gemacht?
btw:
Welchen Compiler benutzt du? Vllt. hat der ja 'ne Macke.
-
Ich habe das Problem gelöst. Es liegt daran, dass ich die Funktion gleich im Header
deklariert habe und dieser wird von mehreren anderen Datei wie zum Bsp. der des Programms inkludet. Er hatte die Funktion somit mehrfach vorliegen, in der LIB wie auch im Programm. Warum auch immer.Nun habe ich ein anderes Problem. Ich kann keine LIB mehr erzeugen. Er kompilert alle Dateien, linkt sie aber nicht zu einer LIB. In den Projekteigentschften habe ich "Static Library" eingestellt und weiter "Use standard windows libraries".
Der "Linking"-Aufruf fehlt gänzlich. Wenn ich ihn nur linken lasse, sagt er "Up-to-date".<Nur die LIB fehlt. Als dll geht es. Woran kann das liegen?
-
Hmmm...hört sich nach einem bekannten Problem an. Schalt mal die vorkompilierten Header ab und mach einen Rebuild. Notfalls das Projekt neu anlegen.