GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ungewöhnliche, aber nützliche GCC-Befehlszeilenoptionen

Software-Tools bieten normalerweise mehrere Funktionen, aber – wie die meisten von Ihnen zustimmen werden – werden nicht alle ihre Funktionen von allen verwendet. Im Allgemeinen ist daran nichts auszusetzen, da jeder Benutzer seine eigenen Anforderungen hat und die Tools nur in diesem Bereich verwendet. Es ist jedoch immer gut, die von Ihnen verwendeten Tools weiter zu erkunden, da Sie nie wissen, wann sich eine ihrer Funktionen als nützlich erweisen könnte, und sparen Sie dabei wertvolle Zeit.

Fallbeispiel:Compiler. Ein guter Programmiersprachen-Compiler bietet immer eine Fülle von Optionen, aber Benutzer kennen und verwenden im Allgemeinen nur eine begrenzte Menge. Insbesondere wenn Sie C-Sprachentwickler sind und Linux als Entwicklungsplattform verwenden, verwenden Sie höchstwahrscheinlich den gcc-Compiler, der eine endlose Liste von Befehlszeilenoptionen bietet.

Wussten Sie, dass Sie, wenn Sie möchten, gcc bitten können, die Ausgabe in jeder Phase des Kompilierungsprozesses zu speichern? Kennen Sie die -Mauer Option, die Sie zum Generieren von Warnungen verwenden, deckt einige spezifische Warnungen nicht ab? Es gibt viele Befehlszeilen-gcc-Optionen, die nicht häufig verwendet werden, aber in bestimmten Szenarien äußerst nützlich sein können, beispielsweise beim Debuggen des Codes.

In diesem Artikel werden wir daher einige dieser Optionen behandeln, alle erforderlichen Details anbieten und sie, wo immer nötig, durch leicht verständliche Beispiele erläutern.

Aber bevor wir fortfahren, denken Sie bitte daran, dass alle Beispiele, Befehle und Anweisungen, die in diesem Tutorial erwähnt werden, auf Ubuntu 16.04 LTS getestet wurden und die von uns verwendete gcc-Version 5.4.0 ist.

 

Siehe die Zwischenausgabe während jeder Kompilierungsstufe

Wussten Sie, dass Ihr C-Code im Großen und Ganzen vier Phasen durchläuft, wenn Sie ihn mit dem gcc-Compiler kompilieren? Diese sind Vorverarbeitung, Kompilierung, Assemblierung und Verknüpfung. Nach jeder Stufe erzeugt gcc eine temporäre Ausgabedatei, die an die nächste Stufe übergeben wird. Nun, das sind alles temporäre Dateien, die erzeugt werden, und daher können wir sie nicht sehen - alles, was wir sehen, ist, dass wir den Kompilierungsbefehl ausgegeben haben und er die Binärdatei/ausführbare Datei erzeugt, die wir ausführen können.

Aber angenommen, beim Debuggen müsste man sehen, wie der Code nach, sagen wir, der Vorverarbeitungsphase aussah. Was würdest du dann tun? Nun, das Gute ist, dass der gcc-Compiler eine Befehlszeilenoption anbietet, die Sie in Ihrem Standard-Kompilierungsbefehl verwenden können, und Sie erhalten diese Zwischendateien, die sonst vom Compiler gelöscht werden. Die Option, über die wir sprechen, ist -save-temps .

Folgendes steht auf der Manpage von gcc zu dieser Option:

           Store the usual "temporary" intermediate files permanently; place
           them in the current directory and name them based on the source
           file.  Thus, compiling foo.c with -c -save-temps produces files
           foo.i and foo.s, as well as foo.o.  This creates a preprocessed
           foo.i output file even though the compiler now normally uses an
           integrated preprocessor.

           When used in combination with the -x command-line option,
           -save-temps is sensible enough to avoid over writing an input
           source file with the same extension as an intermediate file.  The
           corresponding intermediate file may be obtained by renaming the
           source file before using -save-temps.

Das Folgende ist ein Beispielbefehl, der Ihnen eine Vorstellung davon gibt, wie Sie diese Option verwenden können:

gcc -Wall -save-temps test.c -o test-exec

Und so habe ich überprüft, ob alle Zwischendateien tatsächlich erstellt wurden, nachdem der oben erwähnte Befehl ausgeführt wurde:

Wie Sie im obigen Screenshot sehen können, ist die test.i , test.s , und test.o Dateien wurden von -save-temps erzeugt Möglichkeit. Diese Dateien entsprechen jeweils der Vorverarbeitungs-, Kompilierungs- und Verknüpfungsphase.

Machen Sie Ihren Code für Debugging und Profilerstellung bereit

Es gibt spezielle Tools, mit denen Sie Ihren Quellcode debuggen und profilieren können. Beispielsweise wird gdb für Debugging-Zwecke verwendet, während gprof ein beliebtes Tool für Profiling-Zwecke ist. Aber wissen Sie, dass es spezielle Befehlszeilenoptionen gibt, die gcc anbietet, um Ihren Code sowohl für das Debugging als auch für die Profilerstellung bereit zu machen?

Beginnen wir mit dem Debuggen. Um gdb für das Code-Debugging verwenden zu können, müssen Sie Ihren Code mit -g kompilieren Befehlszeilenoption, die der gcc-Compiler bereitstellte. Diese Option erlaubt gcc grundsätzlich, Debugging-Informationen zu erzeugen, die von gdb benötigt werden, um Ihr Programm erfolgreich zu debuggen.

Falls Sie beabsichtigen, diese Option zu verwenden, sollten Sie die Details durchgehen, die die gcc-Manpage zu dieser Option bietet – einige davon können sich in manchen Fällen als lebenswichtig erweisen. Das Folgende ist beispielsweise ein Auszug aus der Manpage:

           GCC allows you to use -g with -O.  The shortcuts taken by optimized
           code may occasionally produce surprising results: some variables
           you declared may not exist at all; flow of control may briefly move
           where you did not expect it; some statements may not be executed
           because they compute constant results or their values are already
           at hand; some statements may execute in different places because
           they have been moved out of loops.

           Nevertheless it proves possible to debug optimized output.  This
           makes it reasonable to use the optimizer for programs that might
           have bugs.

Nicht nur gdb, kompilieren Sie Ihren Code mit -g Option eröffnet auch die Möglichkeit, das Memcheck-Tool von Valgrind in vollem Umfang zu nutzen. Für diejenigen, die es nicht wissen, Memcheck wird von Programmierern verwendet, um nach Speicherlecks (falls vorhanden) in ihrem Code zu suchen. Hier erfahren Sie mehr über dieses Tool.

Um gprof für die Code-Profilerstellung verwenden zu können, müssen Sie Ihren Code mit -pg kompilieren Befehlszeilenoption. Es ermöglicht gcc, zusätzlichen Code zu generieren, um Profilinformationen zu schreiben, die von gprof für die Codeanalyse benötigt werden. „Sie müssen diese Option verwenden, wenn Sie die Quelldateien kompilieren, zu denen Sie Daten wünschen, und Sie müssen sie auch beim Verknüpfen verwenden“, heißt es auf der gcc-Manpage. Um mehr darüber zu erfahren, wie man Code-Profiling mit gprof durchführt, gehen Sie zu dieser speziellen Anleitung auf unserer Website.

Hinweis :Verwendung von beiden -g und -pg options ist ähnlich wie bei -save-temps Option wurde im vorherigen Abschnitt verwendet.

Schlussfolgerung

Ich bin mir sicher, dass Sie mit diesem Artikel etwas Neues gelernt haben, es sei denn, Sie sind ein gcc-Profi. Probieren Sie diese Optionen aus und sehen Sie, wie sie funktionieren. Warten Sie in der Zwischenzeit auf den nächsten Teil dieser Tutorial-Reihe, in dem wir weitere interessante und nützliche gcc-Befehlszeilenoptionen besprechen werden.


Linux
  1. Nützliche PS-Optionen

  2. 15 am häufigsten verwendete GCC-Compiler-Befehlszeilenoptionen

  3. grub-install-Befehlsoptionen

  4. dpkg-reconfigure-Befehlsoptionen

  5. Wie kann festgestellt werden, welche Befehlszeilenoptionen gcc standardmäßig an ld übergibt?

10 nützliche Linux-Kommandozeilen-Tricks für Neulinge – Teil 2

Diff-Befehl unter Linux

Meistern Sie die Linux-Befehlszeile

Grundlagen der Linux-Befehlszeile:sudo

Thunar-Befehlszeilenoptionen?

19 Nützliche Tipps und Tricks für die Linux-Befehlszeile