LinkErrors
-
hi,
also sry erstmal für den seehhrrr ausdrucksstarken Titel^^ich habe ein Header-File, in dem sind mehrere Klassen, <math.h>, und boost.operators includiert.
Nun habe ich ein MFC-Project erstellt (kein Dokument/Ansicht, sondern einfach ein SingelDokument) und möchte nun hier die oben genannte Datei includen und dann in der Klasse CChildView eine Instanz einer der Klassen in dieser Header-Datei erstellen.
So jetzt die Frage aller Fragen: Wo bitte soll denn das include hin?

Der einzige Ort, wo es ohne irgendwelche LinkErrors oder sonstiges hingehauen hat, war in der stdafx.h, nur gibt es da das Problem, das es manchmal doch zu diesen Fehlermeldungen kommt und nachdem ich NUR (!!!!!) die #include ein paar Mal hin und her geschoben habe es wieder ging (ich schwöre, onst hab ich NICHTS an dem Code geändert).
Jetzt habe ich das #include in jede Datei nacheinander reingesetzt und bei keiner hat es funktioniert

Nunja, ich liebe cpp-Dateien......

-
Könntest Du etwas präziser sein?
Was für LinkErrors?
In der Regel kommen da Linker Fehler Lxxxx oder so etwas.
Und im Zusammenhang mit Header Dateien, sind das wirklich Linker Fehler oder doch Compiler Fehler (also Cxxxx).
xxxx steht für eine Nummer, die Compiler oder Linker normalerweise liefern
.Gruss, Gio
-
error LNK2005: "double __cdecl frac(double)" (?frac@@YANN@Z) bereits in ChildView.obj definiert
und so weiter
PS: ganz blöd bin ich auch nicht^^ Also Compiler und Linker-Errors kann ich schon noch auseinander halten

-
Und nun noch ein Code Auszug damit man sich ein Bild machen kann ...
Und das MSDN sagt folgendes:
Linker Tools Error LNK2005
symbol already defined in objectThe given symbol, displayed in its decorated form, was multiply defined.
Tips
One of the following may be a cause:
The most common cause of this error is accidentally linking with both the single-threaded and multithreaded libraries. Ensure that the application project file includes only the appropriate libraries and that any third-party libraries have appropriately created single-threaded or multithreaded versions.
The given symbol was a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include the symbol.
The given symbol was defined differently in two member objects in different libraries, and both member objects were used.
An absolute was defined twice, with a different value in each definition.
This error is followed by fatal error LNK1169.Gruss, Gio
-
Das Problem liegt höchstwahrscheinlich in der Kompilierungreihenfolge der cpp-Files: bei einem vom Aufbau sehr ähnlichen Projekt war die Ausgabe:
Kompilieren... stdafx.cpp Kompilieren... MainFrm.cpp [b]Projektname.cpp ChildView.cpp[/b] Code wird generiert... Ressourcen werden kompiliert... Verknüpfen...und in dem jetzigen Projekt:
Kompilieren... stdafx.cpp Kompilieren... MainFrm.cpp [b]ChildView.cpp Projektname.cpp[/b] Code wird generiert... Ressourcen werden kompiliert... Verknüpfen...sprich: Projektname.cpp und ChildView.cpp sind in der Kompilierung vertauscht.
Wie kann man das einstellen?
-
ESS_CB schrieb:
Das Problem liegt höchstwahrscheinlich in der Kompilierungreihenfolge der cpp-Files:
Extrem unwahrscheinlich. Ich vermute eher, dass du die Funktion frac in einer Headerdatei definiert hast, und diese Headerdatei dann in mehr als einer .cpp-Datei eingebunden hast.
-
ja, stimmt, aber in dem anderen Projekt ist es genau so.
also, die beiden Headerdatei sind in beiden Projekten in der ChildView.h includiert.
Die beiden Header Dateien sind wiederum im Aufbau gleich:
sie enthalten eine Klasse und ein include einer Headerdatei mit einer weiteren Klasse.Auch bei dem Projekt, bei dem es funktioniert, wurde die Header mehrmals eingebunden, da auch die ChildView.h mehrmals eingebunden wird und zwars einmal in der MainFrame.cpp und in der Projektname.cpp, da in dieser wiederum die MainFrame.h includiert ist.
da das jetzt wahrscheinlich seehhhr verwirrend klingt:

ChildView.h:#include "Headerdatei.h"MainFrame.h:
#include "ChildView.h"Projektname.cpp:
#include "MainFrame.h"Aber wieso funktioniert das eine nicht, wenn beide doch fast identisch sind?
Und ich hatte schonmal ein Projekt wo es nur an so einer Verdrehung der Kompilation lag. Damals hatte ich genau die gleichen Probleme, ich weiß aber nicht mehr wie ich da damals gelöst hatte

PS: kann das an dem boost-Include liegen?
#include <boost/operators.hpp>
-
Wir können uns jetzt lang und breit darüber den Kopf zerbrechen, warum es in Projekt X mit Kompilierreihenfolge Y möglicherweise mal funktioniert hast.
Aber was bringt das? Mach's doch einfach richtig, und nimm die Definition aus der Headerdatei raus. Alternativ kannst du die Funktion auch als inline deklarieren.
-
thx, gracias, danke und merci^^
das mit dem inline hat hingehauen

*mir das gleich hinter Ohren schreib
