Frage: includes
-
Hallo Leute, ich bin mal wieder ratlos:
Nach längerem Hin- und Hertesten mit C++ habe ich jetzt diverse Klassen in jeweils zwei Dateien (Header und Body) und möchte diese jetzt an einem zentralen Platz versammeln. Hab ich auch gemacht, liegen alle unter ../inc/
So, nun ein neues Projekt erstellt, unter den Projekt-Eigenschaften (Visual Studio .Net) das inc-Verzeichnis angegeben ("Additional Include Directories") und in dem neuen Projekt eine main.cpp erzeugt, die diese Klassen benutzt. Oder besser, benutzen will, denn übers Linken komme ich nicht hinweg:MyNamespace::MyClass myInstanz;
endet in:
error LNK2019: unresolved external symbol "public: __thiscall MyNamespace::MyClass::MyClass(void)"
error LNK2019: unresolved external symbol "public: __thiscall MyNamespace::MyClass::~MyClass(void)"Bestimmt mach ich was ganz banales falsch
, kann mir jemand aufhelfen?
-
Hat die Klasse denn einen Konstruktor und einen Destruktor?
-
Ja klar.
Im Konstruktor wird eine ini-Datei gelesen:FacsRegions::FacsRegions()
{
Read_IniFile();
}FacsRegions::~FacsRegions()
{
}
-
main.cpp beginnt dann mit:
#include "FacsRegions.h"
using namespace std;
using namespace MyNamespace;
-
hm, war wohl doch keine dummy-frag
Oder seid ihr alle schon im wochenende??Geht das überhaupt, was ich mir da einbilde? Also spezieller Quellcode im Projektverzeichnis und allgemeiner Quellcode in /inc.
-
'unresolved external' resultieren durch fehlende Implementierungen, nicht durch falsche Includes... Hast du vielleicht vergessen die Datei mit dem Konstruktor/Destruktor mitzulinken?
-
DrGreenthumb schrieb:
Hast du vielleicht vergessen die Datei mit dem Konstruktor/Destruktor mitzulinken?
Kannst Du das etwas genauer benennen, was Du meinst? Ich frage ja deshalb, weil ich das das erste Mal überhaupt versuche, daß nicht alle Quelldateien in einem Verzeichnis stehen.
-
Naja, du musst weiterhin jede Quellcode-Datei mitcompilieren. Weiß nicht was man dazu jetzt noch sagen könnte. Wie man das genau macht, hängt dann vom Compiler ab.
-
mein msvc muss man die *.cpp datei zum projekt hinzufügen
-
So, Freunde des Computers, ich hab das "Problem" anders gelöst und höchstwahrscheinlich ist es so auch viel sinniger:
Hab im inc-Verzeichnis in "Static Library"-Projekt erstellt und damit eine lib-Datei erzeugt, die sämtliche allgemeine Klassen enthält, und diese in mein spezielles Projekt eingebunden. Wieso eigentlich nicht gleich so
Schönen Tag noch...
-
hmm im grunde ist es aber das, was drGreenthumb sagte, ob du nun die entsprechenden implementierungs-cpps mitlinkst, oder daraus erst einen batzen machst in einer library und diese dann mitlinkst, ist gehupft wie gesprungen...
wichtig: es fehlte einfach die implementierung.
-
elise schrieb:
wichtig: es fehlte einfach die implementierung.
Ja, schön, aber es konnte mir ja niemand weiterhelfen, wo genau der Haken liegt.
Das ich das Zeug mitlinken muß, ist mir schon klar, aber wie??
Also was genau meinst Du mit "fehlender Implementierung" ? Das ist sicher eine bescheuerte Frage, aber die hab ich nun mal. Und wirklich niemanden in greifbarer Nähe, den man fragen könnte.
Ich hab leider nicht die Wahl, sondern muß das mit Visual Studio .Net durchziehen und die Hilfe ist manchmal eben sehr Microsoft-typisch: man kommt vom Hundertsten ins Tausendste und ist am Ende genauso schlau wie vorher. Noch dazu läuft das Studio hier in Englisch, das ist zwar im Prinzip völlig egal, aber bei Themen, wo man eh schon nicht den großen Durchblick hat, stört es dann schon, auch noch eine englische Hilfe durchackern zu müssen...
-
hi bini
im grunde fehlte ihm einfach nur der körper einer funktion, die du ihm in einem header angekündigt hast.
denk einfach an prototypen.
du verspricht durch prototypen (fuktionsköpfe ohne definition...), egal ob global oder in einer klasse, daß irgendwo eine funktionsdefinition erfolgt. die steht üblicherweise in einer anderen datei (.cpp), nur selten als inline in der klasse selber.und die muss er finden. du hast es mit dem prototyp angekündigt.
üblicherweise ist es beim visual studio 6 einfach zu lösen, durch "dem projekt hinzufügen... datei...), den 7 ner kenne ich noch nicht, aber die logik kannst du auch bei einem gcc aufruf sehen:
gcc.exe datei_main.cpp datei_implenetierung.cpp -o test.exe
die passenden header findet er durch das include, brauchen nicht mit aufgeführt werden, aber die implementierungen musst du ihm mitgeben.
erstmal.. hoffe nicht zu chaotisch
-
Jetzt hab ich das, was ich wollte. Und es war genau so banal, wie ich vermutet hatte. Ich hab die Header und Bodies direkt aus dem inc-Verzeichnis zum Projekt hinzugefügt. Dann bleiben die Quelldateien dort, wo sie hingehören, und nur die Objects werden ins Projekt gezogen.
Komisch, mir ist so, als hätte ich das gestern schon probiert und es hätte nicht funktioniert. Aber wahrscheinlich waren da einfach noch andere Fehler mit dabeigewesen...
Jedenfalls geht's jetzt, danke.