C Anfängerproblem
-
Hallo, ich grüße euch.
Wir haben seit Woche mit der Programmiersprache C angefangen. Da ich noch ein Newbie bin, bitte ich euch dringend um Hilfe:[edit]Aufgabe 1[/edit]
[edit]
Für diese Aufgabe legen Sie bitte die folgenden drei Dateien an: p1 main.c, p2 main.c, printfunctions.ca. Definieren Sie in printfunctions.c einige (mindestens drei verschiedene) Funktionen zur Ausgabe irgendwelcher
Texte oder Werte auf der Konsole. Die Datei printfunctions.c soll keine main(...)-Funktion
enthalten.b. Definieren Sie in p1 main.c und p2 main.c jeweils eine main(...)-Funktion, in der (beliebige) Aufrufe
von Funktionen aus printfunctions.c vorkommen.c. Schreiben Sie ein Makefile, das es möglich macht, durch einen Aufruf entweder nur Programm 1 (make
p1), nur Programm 2 (make p2) oder beide Programme (make all) zu übersetzen. Achten Sie vor allem
darauf, die Abhängigkeiten f¨ur die verschiedenen Ziele korrekt zu definieren.d. Was passiert, wenn Sie zwei mal direkt hintereinander (make all) aufrufen?
e. Öffnen Sie die Datei p1 main.c, fügen Sie an geeigneter Stelle eine weitere Konsolenausgabe hinzu und
speichern Sie die Änderungen. Was passiert, wenn Sie jetzt erneut ein (make all) aufrufen?f. Ändern Sie das Compiler-Aufruf-Makro in Ihrem Makefile so, dass beim Übersetzen der Module alle Warnungen
ausgegeben werden. Falls Warnungen ausgegeben werden: Um welche Warnungen handelt es sich,
und worin liegen jeweils die Ursachen? Verändern Sie die Quelldateien so, dass keine einzigeWarnung mehr
ausgegeben wird.
[/edit]Ich verwende Cygwin und GCC Compiler ver.3.4.4
Die a) und b) habe ich wie folgt geschafft (hoffe ich)
printfunctions.c
#include <stdio.h> #include <stdlib.h> #include "printfunctions.h" int ausgabe1() { return Eins; } int ausgabe2() { char c = '2'; printf("%c. Ausgabe\n", c); return EXIT_SUCCESS; } int ausgabe3() { char text[] = "3. Ausgabe"; printf(text); return EXIT_SUCCESS; } int quadrat(int faktor) { int produ = faktor * faktor; // produkt return produ; }
Header-Datei
printfunctions.h
#ifndef printfunctions #define printfunctions #define Eins (1) int ausgabe1(); int ausgabe2(); int ausgabe3(); int quadrat(int faktor); #endif
p1_main.c
#include <stdio.h> #include <stdlib.h> #include "printfunctions.h" int main() { printf("Aufruf der Funktion ausgabe1() aus printfunctions.c : %i. Ausgabe \n", ausgabe1()); printf("Aufruf der Funktion ausgabe2() aus printfunctions.c : "); ausgabe2(); printf("\n\n"); return EXIT_SUCCESS; }
p2_main.c
#include <stdio.h> #include <stdlib.h> #include "printfunctions.h" int main() { int iEingabe, iErgebnis; printf("Dieses Programm berechnet das Quadrat einer ganzen Zahl.\n"); printf("Bitte geben Sie eine ganze Zahl ein: "); scanf("%i", &iEingabe); // Einlesen der Eingabe(n) mit &-Operator iErgebnis = quadrat(iEingabe); printf("Das Quadrat von %i ist %i\n\n", iEingabe, iErgebnis); return EXIT_SUCCESS; }
Ich habe mit dem gcc so kompilieren lassen:
[edit]
gcc -g -Wall -o p1 p1_main.c printfunctions.cgcc -g -Wall -o p2 p2_main.c printfunctions.c
[/edit]Aber die makefile kriege ich leider nicht hin. Meine Makefile habe ich so gemacht:
makefile
# Makefile CFLAGS = -g -Wall CC = gcc p1: p1_main.c printfunctions.c $(CC) $(CFLAGS) -o p1 p1_main.c printfunctions.c p2: p2_main.c printfunctions.c $(CC) $(CFLAGS) -o p2 p2_main.c printfunctions.c
Das wäre meine makefile. Aber wenn ich in der Konsole den Befehl
[edit]make p1[/edit]
eingebe, erhalte ich nur die Fehlermeldung:
[edit]***missing separator[/edit]
Ich hoffe, ihr könnt mir helfen
Viele Grüße
-
sind die Befehle im Makefile auch per tab eingerückt ?
Make soll da sehr pingelig sein.
-
hmm.. was meinst du mit "per Tab eingerückt"?
Ich habe es ganz normal mit Notepad++ geschrieben.
Viele grüße
-
Bei der Fehlermeldung kann ich Dir leider nicht helfen, aber ich denke, du hast zu wenig Abhängigkeiten in Deinem Makefile.
Um nicht bei Änderungen an einer Quelldatei immer beide Quelldateien zu übersetzen, sollte das so aussehen (nur mal für p1):
p1: p1_main.o printfunctions.o gcc -o p1 pl_main.o printfunctions.o pl_main.o: pl_main.c $(CC) $(CFLAGS) -c -o pl_main.o pl_main.c printfunctions.o: printfunctions.c $(CC) $(CFLAGS) -c -o printfunctions.o printfunctions.c
Für p2: kannst Du dann auch auf printfunctions.o: als zweites Target angeben.
So wird nur die Quellatei kompiliert, die sich geändert hat, danach werden die Objectfiles gelinkt.
-
Vielen DAnk, ich habe das Pproblem gelöst.