[Linux] Tool GCC G++ Compiler Light Use (C++)

Inhaltsverzeichnis

1. Verwandter Wissenshintergrund

2. Was ist der Kompilierungsprozess von GCC?

【2.1】Vorverarbeitung (Makroersatz)

【2.2】 Kompilieren (Assembly generieren)

【2.3】Verbinden (ausführbare Datei oder Bibliotheksdatei generieren)

3. Allgemeine Optionen von GCC-Befehlen

4. Dynamische und statische Links


1. Verwandter Wissenshintergrund

gcc und g++ sind die c- bzw. c++- Compilervon gnu .Wenn gcc/g++ Kompilierungsarbeiten durchführt, sind insgesamt 4 Schritte erforderlich:

  • Vorverarbeitung, Generierung von .i- Dateien [Präprozessor-CPP]

  • Konvertieren Sie die vorverarbeitete Datei in Assembler und generieren Sie die Datei .s [ Compiler-EGCs]

  • Es gibt .o- Dateien , die durch Assemblierung in Objektcode (Maschinencode) generiert werden [Assembler als]

  • Verbinden Sie den Zielcode und generieren Sie ein ausführbares Programm [linker ld]

>>预处理(进行宏替换) >>编译(生成汇编)  >>汇编(生成机器可识别代码) >>连接(生成可执行文件或库文件) 

Der Testcode lautet wie folgt:

#include <stdio.h>

// 宏定义
#define M 1234
int main(){
    // 注释:
    // 我是注释。                                                                             
    printf("Hello World\n");
    printf("Hello World\n");
    printf("Hello World\n");
    printf("Hello World\n");
    printf("Hello World\n");
    printf("Hello World\n");
    printf("Hello World\n");

#ifdef SHOW 
    printf("Hollo Show\n");
#else
    printf("Hollo Default\n");
#endif
    printf("宏:%d\n", M);
    return 0;
}

[Makrodefinitionen nicht kompilieren]

gcc main.c -o execute
// 执行结果:
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hollo Default
宏:1234

[Makrodefinition kompilieren]

gcc main.c -o execute -DSHOW
// 执行结果:
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hollo Show
宏:1234

2. Was ist der Kompilierungsprozess von GCC?

【2.1】Vorverarbeitung (Makroersatz)

>> 指令:gcc -E main.c -o main.i
  • Zu den Vorverarbeitungsfunktionen gehören hauptsächlich Makrodefinition, Dateieinbindung, bedingte Kompilierung, Kommentarentfernung usw.

  • Vorverarbeitungsanweisungen sind Codezeilen, die mit einem #-Zeichen beginnen.

  • Option „-E“ , die Funktion dieser Option besteht darin, gcc den Kompilierungsprozess stoppen zu lassen, nachdem die Vorverarbeitung abgeschlossen ist.

  • Die Option „-o“ bezieht sich auf die Zieldatei und die „.i“ -Datei ist das vorverarbeitete C-Originalprogramm

【2.2】 Kompilieren (Assembly generieren)

>> 指令:gcc –S main.i –o main.s
  • In dieser Phase muss gcc zunächst die Standardisierung des Codes prüfen und prüfen, ob Grammatikfehler usw. vorliegen, um die tatsächliche Arbeit des Codes zu bestimmen. Nachdem die Prüfung korrekt ist, übersetzt gcc den Code in Assembler.

  • Benutzer können die Option „-S“ zum Anzeigen verwenden . Diese Option kompiliert nur ohne Assemblierung und generiert Assemblercode.

【2.3】Verbinden (ausführbare Datei oder Bibliotheksdatei generieren)

Bei den oben genannten drei Schritten handelt es sich nur um das Kompilieren des Codes. Bevor der Code ausgeführt werden kann, muss er mit dem Code der C-Standardbibliothek verknüpft werden. Dieser Vorgang wird als Verknüpfung bezeichnet.

>> 指令:gcc main.o –o myMain
// 查看结构
[shaxiang@VM-8-14-centos lesson]$ ls
main.c  main.i  main.o  main.s
// 生成可执行
[shaxiang@VM-8-14-centos lesson]$ gcc main.o -o myMain
[shaxiang@VM-8-14-centos lesson]$ ./myMain 
// main.c 源文件  main.i 预编译文件  main.s 编译文件  main.o 汇编文件  myMain 可执行文件
main.c  main.i  main.o  main.s  myMain
// 执行结果
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hollo Default
宏:1234

3. Allgemeine Optionen von GCC-Befehlen

Optionen erklären
-ansi Es wird nur die ANSI-Standard-C-Syntax unterstützt. Diese Option deaktiviert bestimmte Funktionen von GNU C, wie z. B. die Schlüsselwörter „asm“ oder „typeof“.
-C Kompilieren und generieren Sie nur Objektdateien.
-DMACRO Definieren Sie das Makro MACRO mit der Zeichenfolge „1“.
-DMACRO=DEFN Definieren Sie das MACRO-Makro mit der Zeichenfolge „DEFN“.
-E Führen Sie einfach den C-Precompiler aus.
-G Generieren Sie Debugging-Informationen. Der GNU-Debugger kann diese Informationen ausnutzen.
-IDVERZEICHNIS Geben Sie den zusätzlichen Suchpfad für die Header-Datei DIRECTORY an.
-LDIRECTORY Geben Sie den zusätzlichen Bibliothekssuchpfad DIRECTORY an.
-lBIBLIOTHEK Durchsuchen Sie beim Herstellen der Verbindung die angegebene Funktionsbibliothek LIBRARY.
-m486 Codeoptimierung für 486.
-o DATEI Erzeugt die angegebene Ausgabedatei. Wird beim Generieren ausführbarer Dateien verwendet.
-O0 Es wird keine Optimierung durchgeführt.
-O oder -O1 Optimieren Sie den generierten Code.
-O2 erweiterte Optimierung.
-O3 Weitere Optimierungen als -O2, inklusive Inline-Funktionen.
-geteilt Generieren Sie gemeinsam genutzte Objektdateien. Wird normalerweise beim Erstellen gemeinsam genutzter Bibliotheken verwendet.
-statisch Gemeinsame Verbindungen sind verboten.
- MAKRO Definieren Sie das MACRO-Makro.
-w Es wird keine Warnmeldung generiert.
-Wand Generieren Sie alle Warnmeldungen.

4. Dynamische und statische Links

        In unserem C-Programm ist die Funktionsimplementierung von „printf“ nicht definiert, und die in der Vorkompilierung enthaltene „stdio.h“ enthält nur die Deklaration der Funktion, definiert jedoch nicht die Implementierung der Funktion. Wo ist also die? Implementierung der Funktion „Was ist mit printf“?

        Die endgültige Antwort lautet: Das System implementiert diese Funktionen in einer Bibliotheksdatei mit dem Namen libc.so.6. Wenn nicht angegeben, wechselt gcc zum Standardsuchpfad des Systems „/usr/lib“. Suche, also Link zur libc .so.6- Bibliotheksfunktion, damit die Funktion „printf“ implementiert werden kann, und dies ist die Rolle der Verknüpfung.

Funktionsbibliotheken werden im Allgemeinen in zwei Typen unterteilt: statische Bibliotheken und dynamische Bibliotheken:

  • Statische Bibliothek bedeutet, dass beim Kompilieren und Verknüpfen der gesamte Code der Bibliotheksdatei zur ausführbaren Datei hinzugefügt wird, sodass die generierte Datei relativ groß ist, die Bibliotheksdatei jedoch zur Laufzeit nicht mehr benötigt wird. Das Suffix ist im Allgemeinen „.a“.

  • Im Gegensatz dazu fügen dynamische Bibliotheken beim Kompilieren und Verknüpfen nicht den Code der Bibliotheksdatei zur ausführbaren Datei hinzu. Stattdessen wird die Bibliothek beim Ausführen des Programms von der Laufzeitverknüpfungsdatei geladen, was Systemaufwand sparen kann. Dynamische Bibliotheken haben im Allgemeinen das Suffix „.so“. Wie bereits erwähnt, ist libc.so.6 eine dynamische Bibliothek. gcc verwendet beim Kompilieren standardmäßig dynamische Bibliotheken. Nach Abschluss der Verknüpfung kann gcc die ausführbare Datei generieren.

Das von gcc standardmäßig generierte Binärprogramm ist dynamisch verknüpft, was über den Dateibefehl überprüft werden kann.

file myMain     // 查看可执行文件的详细信息.
ldd myMain      // 查看可执行文件以来的动态库文件.

                In der Linux-Umgebung basieren die meisten Anweisungen auf dynamischen Bibliotheken, daher sind dynamische Bibliotheken sehr wichtig!

>> 命令:file /usr/bin/ls
>> 命令:file /usr/bin/pwd
>> 命令:file /usr/bin/which
>> 命令:ldd /usr/bin/ls

        Beim Kompilieren von Code unter Linux wird standardmäßig die Dynamic Link Library verwendet. Kann es mit einer statischen Bibliothek kompiliert werden?

>> 命令:gcc main.c -o myMain_s -static

Im Allgemeinen müssen statische Bibliotheken selbst installiert werden. Hier finden Sie eine Liste zur Installation statischer Bibliotheken:

  • Überprüfen Sie, ob libc.a installiert wurde

>> 命令:sudo find / -name 'libc.a'  
  • Statische Bibliothek für die Systeminstallation

// centos系列安装
>> 命令:sudo yum install glibc-static   		// 安装C语言静态库
>> 命令:sudo yum install libstdc++-static   	// 安装C++语言静态库
// ubuntu系列安装
>> 命令:sudo apt-get install libc6-dev  
    
// 安装完成后,再次查看静态库
[shaxiang@VM-8-14-centos ~]$ sudo find / -name 'libc.a'
/usr/lib64/libc.a

Guess you like

Origin blog.csdn.net/lx473774000/article/details/132760457