Wo verwenden wir .i-Dateien und wie generieren wir sie?

Lesezeit: 4 Minuten

Benutzeravatar von Nihal Harish
Nihal Harish

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?

  • 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

Sathishs Benutzeravatar
Sathisch

Der .i Dateien werden auch als „reine C-Dateien“ bezeichnet. In der Vorverarbeitungsphase

  1. Header-Dateien werden eingebunden.

  2. Makros werden ersetzt.

  3. Kommentare werden entfernt.

  4. 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

Benutzeravatar von Gabriel Staples
Gabriel Staples

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 gccund drücken Sie dann die / Geben Sie die Suchtaste ein und geben Sie dann ein \.iund 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:

  1. alle Header-Dateien enthalten
  2. Makros ersetzt
  3. 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, .sund 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:

  1. Wie finde ich zur Kompilierzeit heraus, wie viel Flash-Speicher und dynamischer Speicher (SRAM) eines STM32 belegt sind?
  2. Konvertieren Sie die Ausgabe von binutils „size“ vom „sysv“-Format („size –format=sysv my_executable“) in das „berkeley“-Format („size –format=berkeley my_executable“).

1452010cookie-checkWo verwenden wir .i-Dateien und wie generieren wir sie?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy