2010-11-28 4 views
9

Ich habe eine Datei namens "main.c". Was ist das einfachste Makefile, das ich haben kann, um diese Datei in eine ausführbare Datei zu kompilieren, die ich wie ./blah ausführen kann?Was ist das einfachste MAKEFILE Ich könnte die Arbeiten für eine einzelne C-Datei haben?

+0

Bitte einige Mühe machen Sie Ihre Hausaufgaben zu machen, bevor uns zu fragen. Es gibt einen Grund, warum Ihr Professor möchte, dass Sie ein Makefile verwenden - damit Sie Makefiles für nützlichere Projekte schreiben können. –

+3

Sorry, wollte die Hausaufgabenpolizei nicht verärgern. Ich habe es googlen versucht, aber das Makefile ist offensichtlich unglaublich mächtig und kann extrem komplex sein. Ich gebe zu, dass ich einige Probleme habe, viel davon zu verstehen. Dieses Thema ist kein Programmierobjekt, aber die Bewertung erfordert C-Code, um native OS-Funktionen aufzurufen. Ich habe C noch nie vorher berührt, und diese Aufgabe ist in ein paar Stunden fällig. Ich war frustriert und verzweifelt und brauchte Hilfe. Entschuldigung, wenn ich dich verärgert habe. – Ash

Antwort

9
all: 
    gcc -o blah main.c 

Sie brauchen Makefile hier nicht, einfache Shell-Skript ist in Ordnung.

+0

Zuweisung Blatt sagen wir müssen ein Makefile enthalten. – Ash

+0

Wenn ich dies benutze und "make" ausführen - es gibt "Makefile: 2: *** fehlt Trennzeichen. Stop." – Ash

+1

@Ash: Das Bit vor 'gcc' muss ein Tab sein, keine Leerzeichen. (Sie erhalten diesen Fehler, wenn Sie Leerzeichen verwenden.) –

4
all: blah 
blah: main.c 
    gcc main.c -o blah 
+0

Ich schrieb und schrieb meine Antwort vor allem, was sonst noch gezeigt wurde, und ich sah das "Hausaufgaben" -Tag nicht. Ich stimme Chris Lutz zu; Sie werden nirgendwo im Leben nach Hilfe bei solchen miserablen Aufgaben fragen. –

+1

'all: blah' macht das weniger einfach, was es sein muss und kann auch Dinge kaputt machen, wenn eine Datei namens' all' existiert. Abgesehen von diesem Punkt ist dies die beste Antwort. –

+0

Eigentlich, nach weiterem Nachdenken, wird in diesem einfachen Fall eine Datei namens 'all 'wahrscheinlich nicht die Abhängigkeitsüberprüfung durchbrechen; es ist immer noch redundant, da make das erste Ziel in jedem Fall als Standardziel behandelt. –

10

Wenn Sie mit GNU Make und wenn Sie in zusätzlichen Bibliotheken verknüpfen müssen die einfachste Make-Datei ist nicht, überhaupt keine Make-Datei. Versuchen:

make main 

Wenn Sie wollen main nicht müssen angeben, dann können Sie den folgenden einzeiligen Makefile verwenden:

all: main 

GNU hat Machen Sie mehrere implizite Regeln, die es, wenn Sie verwendet definiere sie nicht selbst. Derjenige, der diese Arbeit macht, ist so etwas wie:

%: %.c 
     $(CC) $^ -o [email protected] 

Weitere Informationen finden Sie unter: http://www.gnu.org/software/make/manual/make.html#Using-Implicit

+0

Offenbar erfordert die Zuweisung, dass die Ausgabe 'blah' ist, nicht' main', also benötigt er ein Makefile. Das Obige ist immer noch nützliche Information, wird aber hier nicht wirklich angewendet. –

+1

Wenn Ihre ausführbare Datei "blah" heißen sollte, wäre es am einfachsten, wenn Sie Ihre Quelldatei in "blah.c" umbenennen, wenn dies erlaubt ist. –

+0

@ T.J.Crowder: 'blah' scheint keine Anforderung zu sein, sondern eher ein Beispiel: OP sagte" dass ich rennen kann * wie * './Blah'". Dieses One-Liner 'Makefile' scheint gut zu sein – MestreLion

2

Die einfachste ich empfehlen würde, ist:

myprog: myprog.o 
     $(CC) -o [email protected] @^ 

Via impliziten Regeln, wird dies zur Folge ein separater Schritt, der myprog.c zu myprog.o vor dem Verknüpfen kompiliert. Der Grund Ich mag diese besser als die andere Antwort (von Arnaud) ist, dass es zu mehr Quelldateien skaliert, ohne dass die Make-Datei zu vergrößern, die deutlich:

myprog: myprog.o foo.o bar.o helper.o my.o your.o his.o her.o 
     $(CC) -o [email protected] @^ 
+0

Sollte das' $^'anstelle von' @^'sein? – user2023370

0

Wie Jander gesagt, wenn Ihre Quelle eine einzelne Datei blah.c benannt ist

all: blah 

Oder auch:

blah: 

Alles andere ist Sie könnte dies zur Ausgabe blah namens eine ausführbare Datei verwenden implizit, wenn GNU mit make

Während dies sehr einfach ist, hat es einige Vorteile gegenüber einige der komplexeren Antworten haben:

  • Compiler fest einprogrammiert ist nicht: Lassen Sie Ihre Umgebung gcc für Sie wählen!
  • Ihr Programmname ist nur einmal eingestellt, eine gute DRY Programmierpraxis.
  • Erstellt keine Zwischen *.o Dateien, die für dieses einfache Projekt nicht benötigt werden.

Das heißt, ich schlage vor, Sie dringend, Ihre Makefile zu verbessern, indem sie zumindest clean und all Regeln und -Wall Flags hinzufügen.Dies kann mit der folgenden Makefile erfolgen, noch alle oben genannten Vorteile zu halten:

 
TARGET=blah 
CFLAGS=-Wall 

.PHONY: all clean 

all: $(TARGET) 

$(TARGET): 

clean: 
    rm -f $(TARGET) 
Verwandte Themen