Wie wichtig ist es, Makefiles zu lernen? [geschlossen]

12

Ich arbeite in C ++ hauptsächlich als Hobby (ich bin noch in der Schule und habe daher keinen richtigen Job). Die IDEs generieren das Makefile für mich und ich frage mich, ob es sich lohnt, zu lernen, wie man sie selbst erstellt. Mit "lernenswert" meine ich, sollte ich alles fallen lassen und lernen, wie man sie schreibt, bevor ich mit dem Erlernen von c ++ fortfahre? Wird es wirklich notwendig sein, sie zu lernen? Wenn ja, sollte ich etwas über sie lernen (allgemeine Syntax und Verständnis, wie sie funktionieren usw.) oder wirklich lernen, wie man sie schreibt?

sinθ
quelle
1
Die meisten Open-Source-Projekte verwenden Makefiles auf die eine oder andere Weise. Also, ja, Sie sollten lernen, wie Makefiles funktionieren. Das Schreiben von Hand ist eine andere Geschichte und sollte vermieden werden, anstatt sie mit einem Tool zu generieren, es sei denn, Sie haben nur sehr wenige Dateien oder können generische / implizite Regeln und andere ähnliche Techniken verwenden
permeakra
Wenn Sie möchten, dass andere Ihre Quelle unter Linux und anderen Unix-basierten Betriebssystemen kompilieren, müssen Sie diese lernen.
Sie können die Grundlagen von Makefiles, Abhängigkeiten und Ersetzungen usw. in kürzerer Zeit erlernen, wenn Sie alle Antworten auf diese Frage lesen müssen :)
JohnB

Antworten:

14

Ja, es lohnt sich auf jeden Fall zu verstehen, wie Makefiles funktionieren. Es ist momentan möglicherweise nicht relevant für Sie (da Sie eine IDE verwenden, die sie generiert), aber es besteht die Möglichkeit, dass das Wissen in Zukunft nützlich sein wird.

Mit "lernenswert" meine ich, sollte ich alles fallen lassen und lernen, wie man sie schreibt, bevor ich mit dem Erlernen von c ++ fortfahre?

Ehrlich gesagt, das ist eine bizarre Vorstellung von "lernenswert" ...

Aber nein, ich glaube nicht, dass Sie das tun müssen.

Wird es wirklich notwendig sein, sie zu lernen?

Wir können nicht vorhersagen, ob Sie dieses Wissen in Zukunft wirklich benötigen werden. Es hängt davon ab, ob Sie mit der C ++ - Programmierung fortfahren und in welchem ​​Kontext Sie dies tun.

Wenn ja, sollte ich etwas über sie lernen (allgemeine Syntax und Verständnis, wie sie funktionieren usw.) oder wirklich lernen, wie man sie schreibt?

Ich würde beides empfehlen. Wenn Sie kein Makefile schreiben können, ist es fraglich, ob Sie wissen, was los ist.

Es gibt den anderen Standpunkt, der besagt, dass zu viel Wissen nicht hilfreich ist.

Wenn Sie sich eingehend damit befassen, werden Sie feststellen, dass es viele verschiedene Versionen von Make gibt und dass es schwierig ist, ein kompliziertes Makefile zu schreiben, das mit mehreren Versionen von Make auf mehreren Plattformen funktioniert. Doch in der Open - Source - Welt, ist es „best practice“ zu bedienende Werkzeuge , wie automake, autoconfund so weiter , die Makefiles zu erzeugen, etc. Wenn Sie das tun, eine Menge von der Version / Plattform im Zusammenhang Komplexität mit hinter den Kulissen ausgeteilt .


Schließlich haben Sie die Frage mit "Java" markiert. Meiner makeMeinung nach sollten Sie keine Java-Anwendungen erstellen (es sei denn, Sie erstellen auch native Codebibliotheken). Es gibt Java-spezifische Build-Tools, die viel einfacher zu verwenden sind ... und einen besseren Job machen als make.

Stephen C
quelle
8

Wenn Sie mit Open Source- oder Unix-ähnlichen Betriebssystemen arbeiten, ja. Nehmen Sie das Herz, sie sind nicht so kompliziert. Lernen makespart Ihnen auf lange Sicht viel Zeit.

EhevuTov
quelle
Zum Lesen lernen oder zum Schreiben lernen?
Beide. Sie möchten wissen, wie Sie es lesen, um Probleme mit der von Ihnen verwendeten Software zu beheben, oder schreiben, um Ihre eigenen zu erstellen.
EhevuTov
Dann muss ich mit dem Schreiben nicht einverstanden sein. Es gibt viele andere - wahrscheinlich viel bessere - Möglichkeiten, Builds zu automatisieren. Das Schreiben wirklich nützlicher Makefiles ist alles andere als trivial und nicht notwendig.
3

Makefiles sind auf UNIX-Systemen (zB AIX, Linux, OS X) wichtig. Ich denke jedoch, dass ihre absolute Wichtigkeit "du musst es wissen" in den letzten Jahren abgenommen hat. Beispielsweise finden Sie sie in der Windows-Entwicklung (Visual Studio usw.) nicht wirklich, und XCode (unter OS X) verwendet insgesamt ein anderes System. Ich mag Java nicht sonderlich, aber ich glaube, dort werden Ameisendateien und so weiter verwendet.

Es gibt ein sehr cooles System namens CMake, das native Build-Dateien für das Betriebssystem generiert, auf dem Sie gerade ausgeführt werden. Wenn Sie beispielsweise Ihre Projektspezifikation in CMake schreiben, können Sie ein Visual Studio-Buildprojekt unter Windows, ein XCode-Projekt unter Mac und ein Makefile unter Linux erstellen. In gewisser Weise ersetzt CMake autoconf und automake.

Normalerweise erstelle ich CMake-Dateien für meine "großen Projekte", aber ich kenne Make für den Fall, dass ich ein schnelles Makefile schreiben möchte. Es ist gut für Ihre kulturelle Kompetenz, da es Unmengen von Softwarebibliotheken gibt, die Makefiles verwenden, und Sie müssen zwangsläufig die spezifischen Compiler und Bibliotheksspeicherorte bearbeiten. Sie werden jedoch feststellen, dass große Projekte (wie KDE) auf CMake und dergleichen migrieren, da Make einige Einschränkungen aufweist, die bei komplizierten Projekten einen unschönen Eindruck hinterlassen.

Eric Brown
quelle
CMake zu lernen wird um Größenordnungen vorteilhafter sein. Makefiles können als Implementierungsdetail angesehen werden. Machen Sie sich nicht die Mühe, sie zu lernen (bis sie wirklich dazu gezwungen werden), genau wie Visual Studio-Projektdateien.
2

Ich bin voreingenommen, da ich denke, dass Makefiles ein schreckliches System sind. Sie sollten sich mit der allgemeinen Syntax vertraut machen, damit Sie ein vorhandenes Makefile ändern können. Aber ich denke nicht, dass es nützlich ist, alles darüber zu lernen oder es von Grund auf neu zu machen.


quelle
Möchten Sie erklären, warum Makefiles ein schreckliches System sind? Verglichen mit was?
JonnyJD
@JonnyJD: Eine Sache ist, ich glaube nicht, dass ein gutes Build-System Sie eine make-Datei in jedes Unterverzeichnis setzen sollte. Aber es ist schlecht, weil es nicht viel einfacher zu benutzen ist, als eine Fledermausdatei zu schreiben, die wirklich etwas aussagt.
Klingt eher so, als würden Sie Build-Dateien nicht gerne von Hand generieren. Was an sich keine große Sache ist. Makefiles sind eine Variante, die man manuell lesen und schreiben kann. (Modularisiert, nur die Abhängigkeitsverfolgung im Vergleich zu Bash / Bat vereinfacht) Der automatisierte Teil ist automake. Das Einzige, was sich tatsächlich stark unterscheidet, ist das Festlegen von Abhängigkeiten in einer GUI und das Speichern aller Abhängigkeiten in einer Projektdatei. Oder welches Build-System ist so viel weniger schrecklich?
JonnyJD
2

Wie bei vielen Aspekten der IDE-Ausgabe ist ein typisches automatisch generiertes Makefile häufig ineffizient strukturiert.

Mit einem angemessenen Verständnis ist es häufig möglich, die Leistung erheblich zu verbessern (schnellere Builds usw.). Wenn Sie jedoch nicht genau wissen, was los ist, wird FUBAR Sie eher treffen, wenn Sie mit einer automatisch erstellten Datei fummeln.

Es wird dringend empfohlen, zu verstehen, was gerade vor sich geht. Ob Sie anschließend eine vorhandene bearbeiten oder eine eigene erstellen, ist eine separate Angelegenheit.

Andrew
quelle
2

In der Lage zu sein, erfolgreich zu verwenden makeoder so, lässt Sie das Kontrollkästchen "versteht, wie die Abhängigkeiten zwischen Teilen eines Programms modelliert werden, das aus mehr als einem Modul besteht" überprüfen.

Blrfl
quelle
1

Das Schreiben von Makefiles ist aus mehreren Gründen eine gute Idee.

  1. Make ist eine Sprache, mit der Sie Abhängigkeiten zwischen Komponenten über Regeln codieren können. Auf diese Weise haben Sie viel Erfahrung mit dem Schreiben von Code und erweitern Ihre Tools, um über das Lösen von Programmierproblemen nachzudenken.
  2. Die Prinzipien, die Sie mit Make lernen, können mit Ant, Maven und Rake verwendet werden, wenn Sie das Programmieren in der Java- oder Ruby-Welt erlernen möchten.
  3. Viele IDEs verfügen über Magic-Dateien, die Konfigurationsinformationen enthalten, die Sie beim Erstellen Ihrer Software unterstützen. Wenn Sie mir nicht glauben, versuchen Sie, ein Skript zu schreiben, um Ihre Software ohne die IDE zu erstellen. Wenn Sie Ihre eigenen Makefiles schreiben, werden Sie sich der Abhängigkeiten zwischen Ihrem Code, Ihren Bibliotheken und Ihren Umgebungsvariablen sehr bewusst. Wenn die Systeme größer werden, erweist sich dies als nützliches Tool zum Debuggen Ihres Systems.
Jay Godse
quelle
0

Sie sollten immer versuchen, das von Ihnen verwendete Build-System zu verstehen.

Das bedeutet nicht unbedingt, dass Sie in der Lage sein müssen, alle Build-Dateien von Hand zu erstellen. Der wichtige Teil besteht darin, zu verstehen, was das Build-System für Ihr Projekt tut, und die allgemeine Fähigkeit, kleine Projekte manuell zu kompilieren (wie unter "Befehle auf einem Terminal eingeben").

Ich neige dazu zu denken, dass das Erstellen von (einfachen) Makefiles der einfachste Schritt ist, um zu verstehen, was vor sich geht, aber Sie haben möglicherweise andere Mittel, um zu verstehen, wie man Dinge erstellt.

Warum / wann Makefiles lernen?

Wenn Sie weiterhin nur für Windows programmieren und nicht erwarten, dass andere Ihren Code kompilieren, können Sie den Code nach Ihren Wünschen kompilieren.

Wenn Sie den Compiler agnostisch programmieren möchten (wie in "Lassen Sie andere entscheiden, welchen Compiler oder welche IDE sie verwenden möchten"), sollten Sie ein anderes Build-System erlernen, als nur Ihre IDE "damit umgehen zu lassen".

Wenn Sie für verschiedene Plattformen programmieren möchten, müssen Sie auf jeden Fall ein weit verbreitetes Build-System verwenden.

Das bedeutet immer noch nicht, dass Sie wissen müssen, wie die automatisch generierten Makefiles im Detail funktionieren. Sie müssen nur wissen, wie die Eingabedateien für das Buildsystem funktionieren. Diese haben manchmal eine ähnliche Syntax.


Ich persönlich mag Makefiles sehr und benutze sie für viele Dinge. Nicht nur Code kompilieren. Ich erstelle ein Makefile für jedes größere PDF, das ich erstelle (mit LaTeX), und für jedes Projekt, in dem ich einige Aufgaben automatisieren muss (Erstellen, Packen, Hochladen, Aktualisieren von Abhängigkeiten aus Quell-Repositorys, manuelle Backups ziehen / verschieben).

Ich arbeite jedoch viel am Terminal und arbeite mit Linux. Ich verwende keine andere IDE als vim (leistungsstarker Texteditor) und Konsolentools. Dies könnte für Sie sehr unterschiedlich sein.

Wenn Sie sich jemals darüber beschwert haben, verschiedene wiederkehrende Befehle ausführen zu müssen, nur um / package / upload / .. ein "Projekt" zu "aktualisieren", könnte es hilfreich für Sie sein, zu lernen, wie man Makefiles schreibt.

Wenn Sie Tools / GUIs / IDEs für alles haben und verwenden, können Sie dieses Wissen möglicherweise nicht nutzen.

JonnyJD
quelle