Probleme bei Teilung eines Programms (Header, Implementierung, Hauptprogramm)
-
Es kommt immer auf die Linkereinstellung an. Eine Fehlermeldung des Linkers "WinMain@16 wurde nicht gefunden", weist darauf hin, dass der Linker auf subsystem windows eingestellt ist. @16 bedeutet, dass vor dem Aufruf dieser Funktion 16 Bytes auf den Stack geschoben werden müssen (wenns dich interessiert: HINSTANCE, HINSTANCE, LPSTR, int -> du kompilierst für 32 Bit).
WinMain ist wie schon geschrieben der Einstiegspunkt jeder Nicht-Konsolen-Anwendung unter Windows.
Aber wenn's jetzt mit dem Einstiegspunkt main() wieder läuft (Linker: subsystem console), hast du doch keine Probleme, oder?
-
Hmm, ich habe wohl noch einige Lücken was Compiler, Linker und weitere Grundlagen angeht. Das scheint mir aber für Einsteiger sehr kompliziert und nicht unbedingt notwendig zu sein.
Bisher habe ich nicht mit einer IDE gearbeitet, sondern ausschließlich mit dem g++ Compiler in MinGW, den ich über die Eingabeaufforderung mit
g++ datei.cppaufgerufen hatte. Aber bisher hatte ich auch nur einzelne Dateien kompiliert und diese nicht aufgespalten. Das hat problemlos funktioniert.
Nun wollte ich versuchen, mein objektorientiertes Programm in eine Header Datei mit der Klassendeklaration, eine Implementierungsdatei mit der Definition der Methoden und eine Datei mit dem eigentlichen Hauptprogramm aufzuspalten.
Wenn ich alles richtig verstanden habe, brauche ich dazu einen Linker, der diese Dateien wieder zusammenführt. Ich dachte, das geht alles schon irgendwie automatisch, ich weiß aber nicht, ob ein Linker überhaupt in MinGW enthalten ist und wie man diesen nutzt. Jetzt wollte ich meine Implementierungsdatei kompilieren und eben dabei trat der oben beschriebene Fehler auf. Wird an dieser Stelle schon der Linker benutzt? Und muss man den Linker aktiv aufrufen, wenn man ohne IDE arbeiten möchte?Das rein aus Interesse, denn wie gesagt scheint mir das alles komplizierter zu sein, als ich es im Moment möchte. Um diese Schwierigkeiten zu umgehen, habe ich jetzt Code::Blocks installiert und diese 3 Dateien zusammen in ein Projekt gepackt - das klappt wunderbar, anscheinend werden alle diese Aufgaben automatisch erledigt

Vorerst sind meine Probleme damit gelöst. Trotzdem funktioniert das Kompilieren über die Eingbeaufforderung nicht mehr mit dem gewohnten Aufruf, obwohl MiniGW installiert ist, und ich weiß nicht, wie man ohne IDE diese Teilung durchführt. Bisher konnte ich nur Quellen finden, die schon sehr viel tiefergehendes Wissen voraussetzen. Also wenn jemand bereit ist, mir diesen Vorgang zu erklären und mir mit meinem MinGW weiterzuhelfen, wäre ich auch daran sehr interessiert und dankbar

Viele (beruhigte) Grüße,
lyrichter
-
Wenn du 3 Dateien hast:
main.cpp - enthaelt die main funktion
box.hpp - enthaelt die definition der box-klasse
box.cpp - enthaelt die implementierung der box-klassedann muesstest du
g++ -c main.cpp g++ -c box.cpp g++ main.o box.o -o programm.exe"g++ -c main.cpp" sagt: kompiliere die Datei zu einer Objekt Datei (in diesem falle main.o).
g++ main.o
sagt, kompiliere und linke die Datei main.o
Da main.o bereits ein objektfile ist, wird nichts kompiliert und nur gelinkt.g++ ist also ein intelligentes ding. es ruft den linker (der heisst ld) mit den richtigen Parametern auf. zB muss ja die C++ Standard Library noch mitgelinkt werden, etc.
Irgendwo da muss dir ein Fehler passiert sein. Da wuerde es helfen wenn du deine Schritte auflistest - dann koennen wir auch den Fehler finden.
-
Hallo Shadow of Mine,
erstmal danke für deine Antwort, das hilft mir schon sehr viel weiter!
Im Moment habe ich aber das Problem, dass der Befehl "g++" schon nicht gefunden wird. MinGW ist wie oben beschrieben aber installiert.Was genau bewirkt denn das "-c" in deinen Befehlen?
Könnte das die Lösung des Problems sein, das zu der Fehlermeldung von oben geführt hat (als ich box.cpp kompilieren wollte und der Befehl g++ noch funktioniert hat)?Viele Grüße,
lyrichter
-
-c steht für "compile", also daß die Datei(en) nur kompiliert, aber nicht gelinkt werden sollen.
Du kannst natürlich auch alles in einem Schritt machen:g++ main.cpp box.cpp -o programm.exeFür größere Projekte solltest du aber eine IDE verwenden (oder aber stattdessen selber ein makefile erstellen).
P.S. Hast du denn jetzt den "g++" wieder zum Laufen bekommen?
-
Da du ja sowieso Windows zu nutzen scheinst, kannst du auch einfach Visual C++ 2010 runterladen. Damit hast du eine vernünftige IDE.
Beim Erstellen eines Projektes musst du auch dort Konsolenanwendung auswählen und alles sollte dann klappen.
-
Th69 schrieb:
-c steht für "compile", also daß die Datei(en) nur kompiliert, aber nicht gelinkt werden sollen.
Du kannst natürlich auch alles in einem Schritt machen:g++ main.cpp box.cpp -o programm.exeAh, danke

Th69 schrieb:
P.S. Hast du denn jetzt den "g++" wieder zum Laufen bekommen?
Leider nicht, nein. Mir sind die Ideen ausgegangen.
-
lyrichter schrieb:
Leider nicht, nein. Mir sind die Ideen ausgegangen.
Wie hast du denn vorher kompiliert?
uU heissen die Sachen beim mingw auch etwas anders, zB mingw-g++ oder so. Oder aber das bin Verzeichnis ist nicht in der Path-variable. Kann eine Million Gründe haben...

-
Ja, das glaube ich

Also, zuerst hatte ich recht lange in der Konsole über den Aufruf "g++ dateiname" kompiliert.
Jetzt habe ich aber vor Kurzem festgestellt, dass ich garnicht den MinGW-Compiler genutzt habe, den ich extra dafür installiert hatte (C:\MinGW), sondern einen anderen MinGW-Compiler, der zufällig und ohne mein Wissen in einer Python(x,y)-Distribution enthalten war.
Den habe ich dann deinstalliert, zusammen mit dem ganzen Python(x,y)-Paket, und MinGW nochmals regulär installiert (C:\MinGW).
Jetzt funktioniert der gewohnte Aufruf nicht mehr - "Der Befehl g++ ist entweder falsch geschrieben..."MinGW habe ich hier heruntergeladen:
http://sourceforge.net/projects/mingw/files_beta/Automated MinGW Installer/mingw-get-inst/ (mingw-get-inst-20100909)
Vielleicht habe ich mich hier bei der Datei vertan. Ich muss zugeben, bei der Auswahl habe ich mehr geraten als gewusst, was ich da herunterlade, aber das sah alles sehr gut aus - nur funktioniert hat es leider bisher nicht.Gibt es sonst irgendwelche Daten, die ich dir nennen könnte, die dir bei der Fehlersuche weiterhelfen?
-
In dem mingw installations ordner muss es ein bin verzeichnis geben. Darin sollten g++ und co drinnen liegen. Je nach windows dass du benutzt musst du nun anders vorgehen.
Du musst naehmlich das bin verzeichnis der PATH variable hinzufuegen. Wenn du in der konsole dann g++ schreibst sucht windows in allen verzeichnissen die in der path variable stehen nach einer g++.exe oder g++.bat ...
Google sollte dir da helfen.
Alternativ kannst du auch einfach den pfad haendisch angeben:
C:\mingw\bin\g++ main.cpp box.cpp -o programm.exe