Einführung

Einführung

Beginnen wir nach all dieser Theorie und des Gesprächs den Code, der in den letzten neun Teilen dieser Serie geschrieben wurde. Dieser Teil unserer Serie könnte Ihnen tatsächlich dienen, auch wenn Sie C an einen anderen Ort gelernt haben oder wenn Sie der Meinung sind, dass Ihre praktische Seite der C -Entwicklung ein wenig Kraft benötigt. Wir sehen. Bevor wir beginnen, möchten Sie sich vielleicht unsere neuesten Artikel darüber ansehen, wie Sie Ihre Entwicklungsumgebung anpassen können:

  • Einführung in VIM Editor
  • Einführung in EMACs
  • Anpassen von VIM für die Entwicklung
  • Anpassen von EMACs für die Entwicklung

Aufbau Ihres Programms

Denken Sie an den ersten Teil unserer C -Entwicklungsreihe? Dort haben wir den grundlegenden Prozess beschrieben, der stattfindet, wenn Sie Ihr Programm zusammenstellen. Aber wenn Sie nicht in der Compiler -Entwicklung oder in einem anderen sehr niedrigen Material arbeiten, werden Sie nicht interessiert, wie viele JMP -Anweisungen die generierte Assembler -Datei hat, falls vorhanden. Sie möchten nur wissen, wie Sie so effizient wie möglich sein können. Darum geht es in diesem Teil des Artikels, aber wir kratzen nur an der Oberfläche, aufgrund der Erweiterung des Subjekts. Ein C-Programmierer für Einstiegsklassen wird es jedoch wissen, nachdem er dies gelesen hat, was für effizient erforderlich ist.

Die Werkzeuge

Abgesehen davon, dass Sie genau wissen, was Sie erreichen möchten, müssen Sie mit den Tools vertraut sein, um das zu erreichen, was Sie wollen. Linux -Entwicklungstools haben viel mehr als GCC, obwohl es allein ausreichen würde, um Programme zu erstellen, aber es wäre eine langwierige Aufgabe, wenn die Größe Ihres Projekts zunimmt. Aus diesem Grund wurden andere Instrumente erstellt, und wir werden hier sehen, was sie sind und wie sie sie bekommen können. Ich habe bereits mehr als vorgeschlagen, dass Sie das GCC -Handbuch gelesen haben, also werde ich nur davon ausgehen, dass Sie es getan haben.

machen

Stellen Sie sich vor, Sie haben ein Multi-File-Projekt mit vielen Quelldateien, die Arbeiten. Stellen Sie sich nun vor, Sie müssen eine Datei (etwas Minderjähriges) ändern und einen Code zu einer anderen Quelldatei hinzufügen. Es wäre schmerzhaft, das gesamte Projekt deswegen wieder aufzubauen. Hier ist der Grund, warum Make erstellt wurde: Basierend auf den Zeitstempeln der Datei wird festgestellt Ziele. Wenn das Konzept immer noch trübe aussieht, machen Sie sich keine Sorgen: Nachdem Sie ein Makefile und die allgemeinen Konzepte erläutert haben, wird alles einfacher erscheinen, obwohl Fortgeschrittene Konzepte mit Kopfschmerzen induzieren können.

Make hat diesen genauen Namen auf allen Plattformen, an denen ich gearbeitet habe. Unabhängig davon, welchen Paketmanager Sie verwenden (falls vorhanden), sei es passend*, Yum, Zypper, Pacman oder Emerge, verwenden. Ein anderer Ansatz wäre, Distributionen mit Paketmanagern mit Gruppenunterstützung zu installieren, um die gesamte C/C ++ - Entwicklungsgruppe/das gesamte Entwicklungsgruppe/das Muster zu installieren. Apropos Sprachen, ich wollte hier einen Mythos entlarven, der besagt. Falsch. Jede Sprache mit einem Compiler/Dolmetscher, der aus der Shell aufgerufen werden kann. In der Tat kann jedes Projekt, das abhängig basierende Aktualisierungen benötigt. Eine aktualisierte Definition eines Makefile wäre also Eine Datei, die die Beziehungen und Abhängigkeiten zwischen den Dateien eines Projekts beschreibt, um zu definieren, was in den Änderungen der Abhängigkeitskette aktualisiert/neu kompiliert werden sollte. Das Verständnis, wie Make -Werke für jeden C -Entwickler von wesentlicher Bedeutung sind, der unter Linux oder Unix arbeitet - ja, kommerzielle Unix -Angebote machen auch eine Version, die wahrscheinlich eine Version von GNU Make unterscheidet, was unser Thema ist. "Andere Version" bedeutet mehr als Zahlen, es bedeutet, dass ein BSD Makefile mit einem GNU -Makefile unvereinbar ist. Stellen Sie also sicher, dass Sie GNU installiert haben, wenn Sie sich nicht in einer Linux -Box befinden.

Im ersten Teil dieses und einige nachfolgenden Artikel haben wir Teile von Yest verwendet und über Teile von Yest gesprochen, ein kleines Programm, das standardmäßig das gestrige Datum zeigt, aber viele nützliche Datum/zeitbezogene Dinge tut. Nachdem sie mit dem Autor Kimball Hawkins zusammengearbeitet hatten, wurde ein kleines Makefile geboren, mit dem wir arbeiten werden.

Lassen Sie uns zunächst einige Grundlagen über das Makefile sehen. Der kanonische Name sollte Gnumakefile sein, aber wenn keine solche Datei vorhanden ist, sucht er in dieser Reihenfolge nach Namen wie Makefile und Makefile, oder so heißt. Übrigens sollten Sie es natürlich lesen und noch einmal lesen und dann noch mehr lesen. Es ist nicht so groß wie GCCs und Sie können viele nützliche Tricks lernen, die später nützlich sein werden. Der am häufigsten verwendete Name in der Praxis ist Makefile, und ich habe noch nie eine Quelle mit einer Datei namens Gnumakefile gesehen. Wenn Sie aus verschiedenen Gründen einen anderen Namen angeben müssen, verwenden Sie Make's -f wie folgt:

 $ make -f mymakefile

Hier ist Yests Makefile, mit dem Sie das Programm kompilieren und installieren können, da es noch nicht von SourceForge hochgeladen wird. Obwohl es sich nur um ein Zwei -Datei -Programm handelt - die Quelle und die Manpage - werden Sie sehen, dass Made Make bereits nützlich wird.

# Makefile zum Kompilieren und Installieren von Yest Uname: = $ (Shell uname -s) cc = gcc Cflags = -Wall cp = cp rm = rm rmflags = -f gzip = gzip Version = yest-2.7.0.5 yest: Ifeq ($ (Uname), sunos) $ (cc) -Dsunos $ (CFLAGS) -O yest $ (Version).C anders $ (CC) $ (CFLAGS) -O yest $ (Version).C Endif All: Yest Install Maninstall Installation: Maninstall $ (CP) Yest/USR/Lokal/bin Maninstall: $ (CP) $ (Version).Man1 yest.1 $ (gzip) yest.1 $ (CP) yest.1.gz/usr/share/Man/Man1/sauber: $ (rm) $ (rmflags) yest yest.1.GZ DEINSTALL: $ (RM) $ (RMFLAGS)/usr/local/bin/yest/usr/share/mAN/mAN1/yest1.gz 

Wenn Sie den obigen Code genau ansehen, werden Sie bereits eine Reihe von Dingen beobachten und lernen. Kommentare beginnen mit Hashes, und da Makefiles ziemlich kryptisch werden können, kommentieren Sie Ihre Makefiles besser. Zweitens können Sie Ihre eigenen Variablen deklarieren, und dann können Sie sie gut nutzen. Als nächstes kommt der wesentliche Teil: Ziele. Diese Wörter, auf die ein Dickdarm folgt, werden als Ziele bezeichnet, und man benutzt sie wie wie Machen Sie [-f Makefile Name] target_name. Wenn Sie jemals von Source installiert wurden, haben Sie wahrscheinlich "Installation machen" eingegeben. Nun, "Installation" ist eines der Ziele im Makefile, und andere häufig verwendete Ziele umfassen "Clean", "Deinstall" oder "All". Eine andere wichtige Sache ist, dass das erste Ziel standardmäßig immer ausgeführt wird, wenn kein Ziel angegeben ist. In unserem Fall wäre dies das Äquivalent zu "Make Yest" gewesen, wie Sie sehen können, was bedeutet, dass eine bedingte Zusammenstellung (wenn wir auf Solaris/Sunos sind, eine zusätzliche GCC -Flagge benötigen) und die Schaffung von eine ausführbare Datei namens "yest". Ziele wie "Alles" in unserem Beispiel tun nichts selbst. Sagen Sie einfach, dass sie von anderen Dateien/Zielen abhängen, um auf dem neuesten Stand zu sein. Sehen Sie sich die Syntax an, nämlich Sachen wie Leerzeichen und Registerkarten, da Make ziemlich prätentiös über solche Dinge ist.

Hier ist ein kurzes Makefile für ein Projekt mit zwei Quelldateien. Die Dateinamen sind SRC1.C und SRC2.C und der Name der ausführbaren Datei muss exec sein. Einfach, richtig?

Exec: SRC1.O SRC2.o GCC -o Exec SRC1.O SRC2.o Src1.O: Src1.C gcc -c src1.C SRC2.O: SRC2.C GCC -c SRC2.C

Das einzige praktisch verwendete Ziel, das auch der Standard ist, ist 'exec'. Es kommt darauf an auf SRC1.O und SRC2.o, was wiederum vom jeweiligen Abhängig abhängt .c Dateien. Also, wenn Sie beispielsweise SRC2 ändern.C, alles, was Sie tun müssen, ist wieder zu laufen, was feststellen wird, dass SRC2.C ist neuer als der Rest und fährt entsprechend fort. Es gibt viel mehr zu machen als hier bedeckt, aber es gibt keinen Platz mehr. Wie immer wird einige Selbststudien gefördert, aber wenn Sie nur grundlegende Funktionen benötigen, wird Ihnen die oben genannten gut dienen.

Das Skript konfigurieren

Normalerweise ist es nicht nur "make && make install" ", denn vor diesen beiden gibt es einen Schritt, der das Makefile erzeugt, insbesondere nützlich, wenn es um größere Projekte geht. Grundsätzlich prüft das Skript, dass Sie über die für die Kompilierung benötigten Komponenten verfügen, aber auch verschiedene Argumente, mit denen Sie das Ziel der installierten Dateien und verschiedene andere Optionen ändern können (e.G. Unterstützung von QT4 oder GTK3, PDF- oder CBR -Dateiunterstützung usw.). Lassen Sie uns in einem kurzen Blick sehen, worum es bei diesen Konfigurationsskripten geht.

Normalerweise schreiben Sie das Konfigurationsskript nicht von Hand. Sie verwenden dafür Autoconf und Automake. Wie die Namen implizieren, generieren Sie Konfigurationskripte bzw. Makefiles. In unserem vorherigen Beispiel mit dem Yest -Programm könnten wir beispielsweise ein Konfigurationsskript verwenden, das die OS -Umgebung erkennt und einige Variablen erstellen, und nach allem, was eine Makefile erzeugt. Wir haben gesehen, dass das Yest Makefile überprüft, ob wir auf Sunos laufen, und wenn wir es sind, fügt eine Compiler -Flagge hinzu. Ich würde das erweitern, um zu prüfen, ob wir an einem BSD -System arbeiten, und wenn ja, rufen Sie Gmake (gnu make) anstelle der nativen make auf. Beide Dinge werden durch Verwendung von Autoconf durchgeführt: Wir schreiben eine kleine konfigurieren.In Datei, in der wir AutoConf mitteilen, was wir überprüfen müssen, und normalerweise möchten Sie nach mehr als OS -Plattform suchen. Möglicherweise hat der Benutzer keinen Compiler installiert, keine Make, keine Entwicklungsbibliotheken, die die Zeit wichtig sind und so weiter. Zum Beispiel eine Zeile, die das Vorhandensein der Zeit überprüfen würde.H im System Standard Header -Standorte würden so aussehen:

 AC_Check_headers (Zeit.H)

Wir empfehlen, dass Sie mit einer nicht allzu-big-Anwendung beginnen, den Quell-Tarball-Inhalt überprüfen und die Konfiguration lesen.in und/oder konfigurieren.Wechselstromdateien. Für Tarballs, die sie haben, Makefile.AM ist auch eine gute Möglichkeit zu sehen, wie eine Automobildatei aussieht. Es gibt ein paar gute Bücher in dieser Angelegenheit, und einer von ihnen ist Robert Mecklenburgs „Management von Projekten mit GNU Make“.

GCC-Tipps und übliche Befehlszeilenflaggen

Ich weiß, dass das GCC -Handbuch groß ist und ich weiß, dass viele von Ihnen es noch nicht einmal gelesen haben. Ich bin stolz darauf, alles zu lesen (alles was auch immer auf IA -Hardware betrifft) und ich muss gestehen, dass ich danach Kopfschmerzen habe. Andererseits gibt es einige Optionen, die Sie wissen sollten, obwohl Sie mehr lernen werden, wenn Sie gehen.

Sie sind bereits auf das -o -Flag gestoßen, das GCC mitteilt, was das resultierende Outfile und -c, das GCC sagt. Apropos, es gibt Optionen, die die Phasen steuern, in denen GCC die Ausführung stoppen sollte. Um vor der Montagestufe nach der Zusammenstellung per se zu stoppen, verwenden Sie -s. In gleicher Weise ist -e zu verwenden, wenn Sie GCC direkt nach der Vorverarbeitung stoppen möchten.

Es ist eine gute Praxis, einem Standard zu folgen, wenn nicht für Einheitlichkeit, sondern für gute Programmiergewohnheiten. Wenn Sie sich in der formativen Zeit als C -Entwickler befinden, wählen Sie einen Standard (siehe unten) und folgen Sie ihm. Die C -Sprache wurde zuerst standardisiert, nachdem Kernighan und Ritchie (RIP) 1978 „The C Programmiersprache“ veröffentlicht hatten. Es war ein nicht formaler Standard, aber in Kürze wurde K & R und respektiert bezeichnet. Aber jetzt ist es veraltet und nicht empfohlen. Später, in den 80ern und in den 90ern, entwickelten ANSI und ISO einen offiziellen Standard, C89, gefolgt von C99 und C11. GCC unterstützt auch andere Standards wie GNUxx, wobei xx 89 oder 99 sein kann, als Beispiele. Überprüfen Sie das Handbuch für Details, und die Option lautet '-std =', "durchgesetzt" von '-pedantic' '.

WARNUNGS-REBENTRAG-Optionen beginnen mit "-W", wie "-wall" (es fordert GCC auf, alle Fehler zu ermöglichen, obwohl sie nicht ganz aktiviert sind) oder '-schwor' (Warnungen als Fehler behandeln, immer empfohlen). Sie können zusätzliche Argumente an die Programme weitergeben, die bei den Vermittlungsschritten wie Präprozessor, Assembler oder Linker helfen. Hier erfahren Sie beispielsweise, wie Sie eine Option an den Linker weitergeben:

 $ gcc [andere Optionen…] -Wl,Möglichkeit [Ein weiterer Satz von Optionen…]

Ähnlich und intuitiv können Sie "WA" für den Assembler und "WP" für den Präprozessor verwenden. Beachten Sie das Komma und den weißen Raum, der dem Compiler mitteilt, dass der Präprozessor/Assembler/Linker -Teil beendet ist. Weitere nützliche Familien von Optionen sind '-g' und Freunde zum Debuggen, '-o' und Freunde zur Optimierung oder '-iVerzeichnis' - Kein White -Raum - um einen Kopfball -haltigen Ort hinzuzufügen.

Abschluss

Ich empfehle Ihnen, sich Zeit zu nehmen, um diesen Artikel zu lesen, mit den Beispielen zu spielen, dann Ihre eigene zu schreiben, um die Komplexität zu erhöhen, während Sie gehen.

Hier ist, was Sie als nächstes erwarten können:

  • ICH. C Entwicklung unter Linux - Einführung
  • Ii. Vergleich zwischen C und anderen Programmiersprachen
  • III. Typen, Operatoren, Variablen
  • Iv. Ablaufsteuerung
  • V. Funktionen
  • Vi. Zeiger und Arrays
  • Vii. Strukturen
  • Viii. Grundlegende I/O
  • Ix. Codierungsstil und Empfehlungen
  • X. Ein Programm erstellen
  • Xi. Verpackung für Debian und Fedora
  • Xii. Ein Paket in den offiziellen Debian -Repositories erhalten

Verwandte Linux -Tutorials:

  • Dinge zu installieren auf Ubuntu 20.04
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • Installieren Sie Arch Linux in VMware Workstation
  • GDB -Debugging -Tutorial für Anfänger
  • Advanced Bash Regex mit Beispielen
  • Hung Linux System? Wie man zur Befehlszeile entkommt und…
  • Big Data Manipulation zum Spaß und Gewinn Teil 1
  • Python reguläre Ausdrücke mit Beispielen
  • Schleifen mit Beispielen verprügeln