mehrere Quelltextdateien kompilieren [Anfängerfrage]
-
Ich habe ein kleines Programm geschrieben, und wollte dieses nun mal auf mehrere Dateien verteilen.
1x .cpp-Datei mit Quellcode allgemein
1x .cpp-Datei mit einer einfachen Funktion (soll mittels "extern" sich eine Variable aus dem 1. Quelltext holen)
1x .hpp-Datei, enthält nur den Prototyp der FunktionLeider bekomme ich immer diese Fehlermeldung, IDE/Compiler ist Visual C++ Express 2008:
...\move.cpp(10) : error C2065: 'cout': nichtdeklarierter BezeichnerDabei müsste es doch klappen, oder?
game.cpp (teilweise)
#include <iostream> #include <stdlib.h> #include <conio.h> #include "header.hpp" #include "move.cpp" using namespace std; //Hauptfunktion int main () { [...] int nTaste = _getch(); [...] move(); [...]move.cpp (vollständig)
#include "header.hpp" extern int nTaste; void move () { if(nTaste == 80) { cout << nTaste; } }header.hpp (vollständig)
void move ();
-
1. cpp-Datei inkludiert man nicht! Was du aber getan hast.
2. in deiner move.cpp fehlt der iostream-Include.cpp-Dateien werden für sich alleine kompiliert. Braucht man in einer Datei was "fremdes", holt man sich den entsprechenden Header per include. Auf keinen Fall holt man sich eine cpp-Datei per include!!!
Deshalb heißen cpp-Dateien eigentlich auch Kompiliereinheit.
cpp-Dateien werden also einzeln kompiliert, dadurch zu Obj-Dateien und die Obj-Dateien werden zu einer EXE gelinkt.
Schau dir nochmal deine Sourcen an.
-
Danke für diesen (wahrscheinlich) wichtigen Hinweis! (das cpp-Files nicht included werden)
OK, ist korrigiert - jetzt habe ich aber einen neuen Fehler:*1>move.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""int nTaste" (?nTaste@@3HA)".
...Debug\DnD-Tabletop.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.*
HIER die NEUE
move.cpp (vollständig)#include <iostream> #include "header.hpp" using namespace std; extern int nTaste; void move () { if(nTaste == 80) { cout << nTaste; } }P.S.: move.cpp ist nicht mehr in game.cpp inkludiert.
-
Ja, er findet nTaste nicht. Du hast ihm mit extern gesagt "du findest später beim Linken nTaste, ich weiß das!". Aber du hast nirgends diese Variable definiert.
Das nTaste in deiner main()-Funktion ist aber eine andere Variable. Es ist eine lokale Variable, die nur innerhalb des Scopes main() gültig ist. Mit
extern int ntaste;sagst du aber, das es eine globale int-Variable ist. Und diese findet der Linker nicht, nachdem alle cpp-Dateien kompiliert wurden.
-
Achja, Anfängerfehler. Lokale <-> Globale Variable. Wenn ich
nTaste = _getch();globalisiere (darf man das so schreiben?) klappts. Danke!
Wie würde man das jetzt sauberer lösen, als mit einer globalen Var.? Kann man das überhaupt? Man wird ja immer wieder darauf hingewiesen, dass globale Var. "nicht schön" sind...
-
Noch als Tip: inkludiere deine eigenen Header-Dateien vor den fremden oder Standard-Headern. Also so:
#include "meinHeader.hpp" #include <iosteam>Hat mehrere Vorteile: 1. wird dein Header nicht durch fremde Header beeinflußt und man weiß was man in diesen noch inkludieren muß.
2. wenn in deiner Header ein Fehler ist, kommt dieser früher, weil du nicht immer warten mußt, bis die fremden Header (die meistens fehlerfreier sind) durchkompiliert sind.Der Tip ist keine Pflicht. Aber macht auch keine Mehrarbeit.

-
tobi2886 schrieb:
Achja, Anfängerfehler. Lokale <-> Globale Variable. Wenn ich
nTaste = _getch();globalisiere (darf man das so schreiben?) klappts. Danke!
Wie würde man das jetzt sauberer lösen, als mit einer globalen Var.? Kann man das überhaupt? Man wird ja immer wieder darauf hingewiesen, dass globale Var. "nicht schön" sind...
Ja, du könntest deine move-Einheit allgemeiner machen bzw. von nTaste unabhängig. Das stärkt die Modularität und Wartbarkeit.
#include "move.hpp" #include <iostream> using namespace std; void move (int taste) { if(taste == 80) { cout << taste; } }Die nTaste kannst du trotzdem lokal lassen:
int main () { [...] int nTaste = _getch(); [...] move(nTaste); // Wert übergeben [...]Deine move-Funktion muß nicht wissen, wie der Tastenwert zustande gekommen ist, es reicht, wenn move weiß, auf welche Werte sie wie reagieren muß.