Wie man ein Makefile schreibt, um ein einfaches C-Programm zu kompilieren
Lesezeit: 7 Minuten
Schiwago
Kompilieren Sie das folgende Programm
#include <stdio.h>
int main(void)
{
printf ("Hello from your first program!\n");
return 0;
}
a)-unter Verwendung einer Datei vom Typ Makefile
b)-die ausführbare Datei heißt Hello
„Bitte helfen Sie bei einer Übung. Ich weiß, wie man das in CodeBlocks macht, aber ich weiß nicht, was Makefile ist und wie man es unter Linux schreibt. Ich habe es mit dem Befehl „gcc filename.c“ und anschließend „./“ kompiliert. a.out”, aber ich verstehe immer noch nicht, was das Makefile ist. Ist es eine Art Shell-Skript, eine Anleitung? Wie würde ein Makefile für diese Aufgabe genau aussehen? Vielen Dank im Voraus 🙂 “
Aus irgendeinem Grund beteiligen sich Low-Level-Programmierer an StackOverflow, denken aber, dass dies nicht der richtige Ort ist, um gute Antworten zu geben und diejenigen zu unterrichten, die es nicht wissen, nur um zynisch zu sein und Links bereitzustellen oder vorzuschlagen, Manpages zu lesen ¯_(ツ)_/¯
– Rafael Eyng
19. Oktober 2017 um 0:49 Uhr
Jayesh Bhoi
Dies ist Ihre einfache Make-Datei für das Hello-Programm.
Angenommen, Sie haben zwei makefiles in einem Verzeichnis namens makefile.m1 Und makefile.m2 und wenn Sie beide Make-Dateien erstellen möchten, verwenden Sie bitte die folgenden Befehle
make -f makefile.m1
make -f makefile.m2
oder einzeln verwenden Makefile das beinhaltet:
m1:
make -f makefile.m1
m2:
make -f makefile.m2
und verwenden make m1 oder make m2
Lassen Sie uns nun Ihre Zweifel über den Namen der Make-Datei ausräumen, die nicht erforderlich ist Makefile
Sie können das Makefile beliebig benennen. Angenommen, ich möchte Namen geben myfirstmakefile.mk. Um es später zu verwenden, müssen Sie make mitteilen, welches Makefile Sie möchten. Verwenden Sie dazu die Option -f:
make -f myfirstmakefile.mk
Und wieder Verlängerung .mk ist auch nicht obligatorisch. Sie können verwenden, was Sie möchten, aber nie vergessen, es zu verwenden -f Möglichkeit.
Möge dies für Sie sinnvoll sein.
Vielen Dank. ? Mit welchem Unix-Shell-Befehl haben Sie begonnen? hast du zuerst in nano Hello.c eingegeben (das Programm Hello world geschrieben und die Datei nano Hello.makefile getippt, oder was waren deine Schritte von Anfang an?
– Schiwago
4. Februar 2014 um 11:05 Uhr
Ich habe das in eine Datei mit dem Namen geschrieben mkmk mit nano und wenn ich tippte make mkmk es heißt 1make: standardmäßig nichts zu tun, aber warum
– Schiwago
4. Februar 2014 um 11:08 Uhr
Nein, unter Linux kopieren Sie einfach den obigen Code in die neue Datei mit dem Namen Makefile und auch machen Hello.c Programm im selben Verzeichnis wie oben Makefile Sie setzen. Gehen Sie jetzt vom Terminal in dieses Verzeichnis und geben Sie einfach ein make bauen Hello.c Und make clean Ausgabe zu reinigen.
– Jayesh Bhoi
4. Februar 2014 um 11:10 Uhr
Ich habe beobachtet, dass es nicht funktioniert, wenn Sie einen anderen Makefile-Namen als “Makefile” angeben. Was ist, wenn Sie zwei Makefiles erstellen müssen?
– Schiwago
6. Februar 2014 um 21:07 Uhr
Nö … es ist nicht zwingend erforderlich, den Dateinamen make anzugeben Makefile Sie können geben, was Sie wollen. Lassen Sie mich Ihre Makefile-Regeln näher erläutern. Bitte sehen Sie sich meine aktualisierte Antwort an.
– Jayesh Bhoi
7. Februar 2014 um 4:20 Uhr
Jens
A makefile ist ein Rezept für die make Dienstprogramm zum Erstellen einer Datei (genannt a Ziel) aus einigen anderen Dateien (sogenannten Abhängigkeiten) mithilfe einer Reihe von Befehlen, die von der Shell ausgeführt werden. Ein Makefile sieht normalerweise so aus:
target: dependency [...]
command1
command2
Versuchen Sie es mit Laufen man make für Details.
Nun zu Ihrer Aufgabe, es besteht wirklich keine Notwendigkeit für ein Makefile, da make hat eingebaute Regeln, die wissen, wie man ein einfaches Programm kompiliert. Alles, was Sie tun müssen, ist, Ihre C-Quelle in einer Datei zu platzieren, die nach dem Namen der ausführbaren Datei benannt ist (Hello) und mit a .c Verlängerung, dh Hello.c.
Dann ein einfaches
$ make Hello
cc Hello.c -o Hello
macht alles. Wenn Sie gcc anstelle von cc verwenden möchten, können Sie ausführen
Wenn Sie Ihrem Ausbilder/Lehrer/Prof sagen, dass ein leeres Makefile alles ist, was Sie brauchen, da Sie wissen, dass die eingebauten Regeln das Richtige tun, erhalten Sie zusätzliche Anerkennung und vielleicht hat Ihr Ausbilder etwas Neues gelernt 🙂 Wenn Sie nach einer Referenz gefragt werden, könnten Sie die relevanten Teile des Herstellerhandbuchs zitieren oder, machen Sie es wie ein Profi, aus dem zitieren POSIX-Standard für das Dienstprogramm makeAbschnitt Standardregeln.
Vielen Dank. Nur um sicherzugehen, dass ich es richtig gemacht habe. Zuerst habe ich ein Hello.c mit nano und meinem Quellcode erstellt, dann habe ich es gespeichert und beendet und (make Hello) in der Terminalkonsole (von Linux/Unix) und ich habe (cc Hello.c -o Hello) unter meinem Befehl. Ich vermute also, dass cc (für das Kompilieren von c) und (-o etw ist, wenn durch das Verknüpfen eine ausführbare Ausgabe in die Dateiausgabe eingefügt wird, aber was bedeutet/bedeutet es tatsächlich in gewöhnlichen Worten (kompiliert Hello.c und gibt eine leere Ausgabe der Makefile-Anweisungen bu default?).Aber dann führe ich denselben Befehl aus (make Hello) und es gab (make: Hallo’ ist aktuell.`)
– Schiwago
4. Februar 2014 um 11:00 Uhr
make kompilieren Sie Ihre Hello.c Datei und erstellen Sie eine Binärdatei gemäß Ihrem Dateinamen. Wenn Sie erneut angeben make Befehl, dann wird es nach Änderungen in Ihrem suchen Hello.c Datei wenn nicht gefunden dann einfach ausgeben Hello is upto date
– Jayesh Bhoi
4. Februar 2014 um 11:22 Uhr
@Zhivago Wenn Sie make ein zweites Mal ausführen, wird überprüft, ob die Abhängigkeit jünger als das Ziel ist. Wenn ja, führt es die Befehle aus. Wenn nicht, gibt es nichts zu tun und zu sagen „Hallo ist aktuell“. Es ist intelligent genug zu wissen, dass es nicht nötig ist, Hello.c zu kompilieren, wenn es sich nicht geändert hat. Das ist der springende Punkt bei make: Führen Sie die minimale Arbeit aus, die zum Aktualisieren eines Ziels erforderlich ist. Wenn du touch Hello.c oder rm Hello es wird neu kompiliert.
– Jens
4. Februar 2014 um 11:59 Uhr
@ Schiwago Die -o file Option an den Compiler benennt die Ergebnisdatei (standardmäßig a.out. Ja, cc ist der traditionelle Name des Unix-C-Compilers, der unter Linux identisch ist mit gcc.
– Jens
4. Februar 2014 um 12:03 Uhr
@Jens Könntest du mir bitte sagen, was du getan hast, als du $ make CC=gcc geschrieben hast Hallo, hast du ein Argument oder eine Variable gesetzt
– Schiwago
19. September 2014 um 14:34 Uhr
Bevor Sie sich für Makefile entscheiden, müssen Sie wissen, was es ist und warum wir es brauchen
Was ist Makefile?
Makefile ist ein Skript, das in einer bestimmten vorgeschriebenen Syntax geschrieben ist und hilft, die Zielausgabe (normalerweise eine oder mehrere ausführbare Dateien) aus Quelldateien durch Kompilieren und Verknüpfen zu erstellen. Mit einfachen Worten, Makefile kompiliert Ihren Quellcode auf einfache und schnelle Weise. Warum brauchen wir Makefile?
=> Große Projekte können mehrere Quelldateien enthalten, die voneinander abhängig oder hierarchisch angeordnet sind. Um beispielsweise Datei A zu kompilieren, müssen Sie zuerst B kompilieren; Um B zu kompilieren, müssen Sie zuerst C kompilieren; usw.
=> Make ist eine Lösung für diese Probleme. Es kann verwendet werden, um das gesamte Projekt auf übersichtliche Weise zu kompilieren und Ihr Ziel gemäß Ihrer Make-Regel (die wir später besprechen werden) zu generieren, indem Sie einen einzigen Befehl namens make eingeben.
=> Ein wichtiges Merkmal ist, dass, wenn ein Projekt nach einigen Änderungen neu kompiliert wird, es nur die geänderten Dateien und alle anderen davon abhängigen Dateien neu kompiliert. Das spart viel Zeit.
=> Bei einem großen Projekt ist es bei wenigen Änderungen am Quellcode mühsam, fehleranfällig und zeitraubend, das gesamte Projekt jedes Mal manuell neu zu kompilieren.
Hast du mal versucht zu googeln Makefile-Tutorial?
– RedX
4. Februar 2014 um 9:31 Uhr
Hast du es versucht CMake-Tutorial?
– Jegorich
4. Februar 2014 um 10:27 Uhr
Aus irgendeinem Grund beteiligen sich Low-Level-Programmierer an StackOverflow, denken aber, dass dies nicht der richtige Ort ist, um gute Antworten zu geben und diejenigen zu unterrichten, die es nicht wissen, nur um zynisch zu sein und Links bereitzustellen oder vorzuschlagen, Manpages zu lesen ¯_(ツ)_/¯
– Rafael Eyng
19. Oktober 2017 um 0:49 Uhr