Ich habe die GCC-Manpage durchgesehen und die folgende Zeile gefunden:
file.i
C source code that should not be preprocessed.
Ich kenne das Laufen gcc -E foo.c
stoppt den Compiler nach der Vorverarbeitung; Aber was ist die reale Anwendung des Schaffens? .i
Dateien.
Gibt es auch eine Möglichkeit, eine zu generieren? .i
andere Dateien als gcc foo.c -E > foo.i
?
Der .i
Dateien werden auch als „reine C-Dateien“ bezeichnet. In der Vorverarbeitungsphase
-
Header-Dateien werden eingebunden.
-
Makros werden ersetzt.
-
Kommentare werden entfernt.
-
Wird für die bedingte Kompilierung verwendet. Wenn man sich das anschaut .i
Datei können Sie diese Dinge sehen.
Befehl zum Generieren .i
Datei ist-
gcc -E foo.c -o foo.i
A file.i
Datei ist:
C-Quellcode, der nicht vorverarbeitet werden sollte.
Quelle: man gcc
Drücken Sie dann die Taste / Schlüssel zum Suchen und suchen Sie nach „\.i
“.
Detaillierte Schritte: man gcc
und drücken Sie dann die / Geben Sie die Suchtaste ein und geben Sie dann ein \.i
und drücken Sie dann die Eingeben Taste, dann drücken Sie die N Taste wiederholt, bis Sie sie finden.
Dies bedeutet, dass a .i
Datei ist vorverarbeiteter Quellcodeso dass es wurde bereits vorverarbeitet. Daher enthält es bereits:
- alle Header-Dateien enthalten
- Makros ersetzt
- und Kommentare entfernt
…wie von @Sathish in seiner Antwort angegeben.
Sie werden auch eine Menge spezieller „Kommentare“ bemerken, die von gcc hinzugefügt wurden und jetzt mit beginnen #
Charakter, wie zum Beispiel diese:
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.c"
# 44 "main.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 374 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
Ich weiß nicht, was das ist und was sie tun. Bitte sagen Sie es mir jemand, wenn Sie es wissen.
Beachten Sie, dass ein einfaches Programm wie dieses:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
Damit zusammengestellt:
gcc -Wall -std=c99 -O0 -save-temps=obj main.c -o ./bin/main
Wird ein produzieren main.i
Datei, die etwa 682 Zeilen lang ist, mit der main()
Die oben gezeigte Funktion befindet sich ganz am Ende.
So generieren Sie alle Zwischendateien, einschließlich der .i
Dateien:
Ich bevorzuge das Generieren alle Zwischendateien (.i
, .o
, .s
und nicht nur das .i
Datei verwenden -E
) auf einmal in einem Lokal bin
Ordner im Projekt mithilfe von gcc
-save-temps=obj
Option wie diese:
mkdir bin
gcc -save-temps=obj foo.c -o ./bin/foo
Jetzt haben Sie die folgenden Dateien im Verzeichnis „foo/bin“:
foo # compiled binary program (AKA: combined "object file",
# "executable", "binary", "program", or "machine code")
foo.i # intermediate, preprocessed C file
foo.o # individual object file
foo.s # assembly file
Führen Sie das Programm natürlich aus mit:
./bin/foo
Hinweise zu „Objektdateien“ und „ausführbaren Dateien“
Beachten Sie, dass die endgültige Ausgabe, die foo
ausführbare Datei heißt „kompiliertes Binärprogramm“,”Programm“, (kombiniert) „Objektdatei“,”ausführbar“,”binär“, oder nur “Maschinensprache“, oder “Einsen und Nullen” (10101010). Es ist ein Objektdatei In Objektdateiformatebenso wie das Individuum *.o
Objektdateien die durch die zu einem zusammengefasst werden Linker um es zu schaffen. Der Linker vereint alles *.o
Objektdateien in eine, um die endgültige Datei zu erstellen foo
ausführbar oder kombiniert Objektdatei.
Der GNU-Linker (ld
) im Handbuch heißt es wie folgt. Siehe Abschnitt „3.1 Grundlegende Linker-Skript-Konzepte“: https://sourceware.org/binutils/docs/ld/Basic-Script-Concepts.html#Basic-Script-Concepts (Hervorhebung hinzugefügt, sowie Inhalt in eckigen Klammern []
):
3.1 Grundlegende Linker-Skript-Konzepte
Wir müssen einige grundlegende Konzepte und Vokabeln definieren, um die Linker-Skriptsprache zu beschreiben.
Der Linker kombiniert Eingabedateien [individual *.o
object files] in ein einzelne Ausgabedatei. Die Ausgabedatei und jede Eingabedatei liegen in einem speziellen Datenformat vor, das als „ Objektdateiformat. Jede Datei heißt an Objektdatei. Die Ausgabedatei wird oft als „ ausführbar, aber für unsere Zwecke nennen wir es auch eine Objektdatei. Jede Objektdatei enthält unter anderem eine Liste von Abschnitte. Manchmal bezeichnen wir einen Abschnitt in einer Eingabedatei als Eingabebereich; Ebenso ist ein Abschnitt in der Ausgabedatei ein Ausgabebereich.
Für mehr Information. Zu Objektdateien können Sie hier auch zwei meiner anderen Antworten sehen:
- Wie finde ich zur Kompilierzeit heraus, wie viel Flash-Speicher und dynamischer Speicher (SRAM) eines STM32 belegt sind?
- Konvertieren Sie die Ausgabe von binutils „size“ vom „sysv“-Format („size –format=sysv my_executable“) in das „berkeley“-Format („size –format=berkeley my_executable“).
Ein anderer Weg ist
gcc --save-temps -o foo foo.c
– David Ranieri
5. August 2014 um 11:47 Uhr
Eine praktische Verwendung besteht darin, Compilerfehler zu melden. Sie senden die
.i
Datei, die den Fehler auslöst, sodass sie von jemandem reproduziert werden kann, der Ihre Header nicht hat. gcc.gnu.org/bugs/#need– Benutzer2404501
5. August 2014 um 12:22