• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

probleme mit 'make'

hi, ich habe ein kleines c programm geschrieben und hab ein makefile dazu gemacht.

das makefile sieht so aus:
Code:
# Makefile

p1:p1_main.c	printfunctions.c
	gcc -o p1 p1_main.c printfunctions.c

p2: p2_main.c	printfunctions.c
	gcc -o p2 p2_main.c printfunctions.c

all: p1 p2

clean:
	rm -f *.o p1 p2

wenn ich jetzt aber in der konsole in den ordner gehe, wo dieses file liegt (und auch alle files, die im code stehen, also die es benutzen soll), dann kommt immer der fehler:

Code:
cc     Makefile.c   -o Makefile
Makefile.c:1:3: error: invalid preprocessing directive #Makefile
Makefile.c:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
make: *** Keine Regel, um »all« zu erstellen.  Schluss.

also in diesem beispiel habe ich "make all" eingetippt..

habe schon überall gesucht, aber mein makefile müsste eigentlich stimmen.
wieso bekomme ich diesen fehler?

Danke!
 
Hi,

soweit ich sehen kann: Die Zeile
Code:
cc     Makefile.c   -o Makefile
verstehe ich nicht: Makefile ist doch ein Skript und keine .c-Datei :?. Wieso wird denn da "cc" ausgeführt ?

Generell: Vor den Doppelpunkten in "Makefile" stehen die Ziele, in derselben Zeile dahinter das, wovon die Ziele abhängig sind. In der Zeile darunter, und zwar mit TAB eingerückt, das, was "make" zum Erstellen der Ziele ausführen soll: Bei "all" fehlt bei Dir die zweite Zeile !

Viele Grüße

P.S: Das gehört nun wirklich nach "Programmierung".
 
OP
H

hdi

Hallo!

Vielen Dank für die Antwort.
Ich habe nicht gesehen, dass es einen Programmierung-Thread gibt, auch nicht so gesucht weil es ja ein Linux Forum ist.

Also zu der zweiten Zeile bei "all":
Ich hab hier so ein Skript, da wird da nie etwas hingeschrieben, bei den anderen schon aber bei all nicht. Ich glaube der nimmt sich das dann aus den einzelnen anderen Anweisungen.

Aber woran es wahrscheinlich liegt:

Ich hab den ganzen Text in eine *.c Datei geschrieben. Also als was muss ich sie denn im Texteditor abspeichern, damit es funktioniert? Was ist denn die Endung einer Skript-Datei?

Dankeschön !

P.S.: Ich bitte einen Mod, den Thread ins korrekte Forum zu moven. Danke.

EDIT:

also ich habe jetzt jede endung weggelassen und die datei einfach nur "makefile" genannt. jetzt tut sich was, aber anscheinend stimmt da was in meinem programm nicht so richtig oder keine Ahnung...

Jetzt wird es wirklich für das Programmier-Forum ;)

Der Fehler, den ich bei "make p1", p2 oder all bekomme, ist folgender:

Code:
gcc -o p2 p2_main.c printfunctions.c
/tmp/ccvEQ251.o: In function `func1':
printfunctions.c:(.text+0x0): multiple definition of `func1'
/tmp/ccWR3YdI.o:p2_main.c:(.text+0x0): first defined here
/tmp/ccvEQ251.o: In function `func2':
printfunctions.c:(.text+0x24): multiple definition of `func2'
/tmp/ccWR3YdI.o:p2_main.c:(.text+0x24): first defined here
/tmp/ccvEQ251.o: In function `func3':
printfunctions.c:(.text+0x43): multiple definition of `func3'
/tmp/ccWR3YdI.o:p2_main.c:(.text+0x43): first defined here
collect2: ld returned 1 exit status
make: *** [p2] Fehler 1

hier einmal der inhalt dieser "printfunctions.c" datei:

Code:
#include <stdio.h>

int func1(int a,int b)
{
	int c = a+b;
	printf("%i\n",c);

}

int func2(int a)
{
	a--;
	printf("%i\n",a);

}

int func3(int a)
{
	int temp = 2*a;
	printf("%i\n",temp);

}

und hier der inhalt der "p2_main.c" datei:
Code:
#include <stdio.h>
#include "printfunctions.c"

int main()
{
	func3(20);
	return 0;
}

Ich verstehe nicht so ganz, wieso "multiple function" als Fehler kommt.
Ich habe die einzelnen Funktionen doch nirgendwo mehrmals deklariert.

Any ideas? Merci :D
 
OP
H

hdi

Kann mir denn keiner helfen?

Ich bitte nochmals jemanden darum, den Thread in das entsprechende Forum zu verschieben, damit mir jemand dort helfen kann. Bitte.

Danke, mfg
 
Hallo,

so geht's:

p2_main.c:
Code:
#include <stdio.h>
#include "printfunctions.c"

int main()
{
   func3(20);
   return 0;
}
printfunctions.c:
Code:
#include <stdio.h>

int func1(int a,int b)
{
   int c = a + b;
   printf("%i\n",c);
}

int func2(int a)
{
   a--;
   printf("%i\n", a);
}

int func3(int a)
{
   int temp = 2 * a;
   printf("%i\n", temp);
}
Makefile:
Code:
# Makefile

p2: p2_main.c
	gcc -o p2 p2_main.c

all: p2

clean:
	rm -f *.o p2
Offenbar hattest Du bzgl. "all:" recht.

Guck Dir doch nochmal an, wie gcc .c- und .o-Dateien zusammenbindet und wann man wie "#include" verwendet.

Oft sind es dieselben Leute, die "Konsole" und "Programmierung" lesen.

Viele Grüße
 
Wenn du kein Target angibst, erstellt make nur den ersten. Das ist bei dir "p1" und nicht "all". Aber "Makefile" sollte der natürlich nicht erstellen.
verstehe ich nicht: Makefile ist doch ein Skript und keine .c-Datei. Wieso wird denn da "cc" ausgeführt ?
Implicit rule. Das ist der Mist, den man make vor 20 Jahren mitgegeben hat.. heute ist man eigentlich mit `make -Rr` immer besser dran.
Ich verstehe nicht so ganz, wieso "multiple function" als Fehler kommt.
Weil du
Code:
gcc -o p2 p2_main.c printfunctions.c
machst, und p2_main.c aber printfunctions.c includiert. Man includiert keine .c!
Mein Favorit ist ja automake für solche Sachen, auch nicht ganz leicht am Anfang.
 
Oben