# GCC G++ glibc libstdc++

在编程的世界里，特别是在C和C++编程中，GCC、G++、glibc和libstdc++是几个非常关键的工具和库，了解它们之间的关系可以帮助我们更好地理解如何进行编译、链接和运行程序。

## GCC(GNU Compiler Collection)

GCC是GNU Compiler Collection(GNU编译器集合)的缩写。它是一个开源的编译器套件，支持多种编程语言，包括C、C++、Fortan、Ada等。 GCC是开发和C++程序时最长用的编译器之一。其核心功能包括：

* 编译源代码：GCC将源代码转换成机器代码
* 优化：GCC支持多种优化选项，可以在编译过程中对代码进行优化，提升执行效率。
* 链接：GCC不仅能将代码编译成目标文件，还能够链接不同的库文件生成可执行文件。

GCC本身包括多个编译器，最常用的有：

* gcc：用于编译C语言源代码
* g++：用于编译C++语言源代码

## G++(GNU C++ Compiler)

G++是GCC中的一个子命令，专门用于编译C++代码。与gcc不同的是，g++不仅仅是将C++代码编译成机器代码，还自动链接C++标准库 `libstdc++`， 这使得C++程序在链接时能正确找到标准库中的实现。

```bash
[gaowanlu@vhost03 bin]$ ldd avant
        linux-vdso.so.1 =>  (0x00007ffc753f7000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fce59f61000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fce59d5d000)
        libprotobuf.so.33.2.0 => /data/home/gaowanlu/local/protobuf/lib64/libprotobuf.so.33.2.0 (0x00007fce596fd000)
        libssl.so.3 => /data/home/gaowanlu/local/openssl-3.5.4/lib64/libssl.so.3 (0x00007fce593f1000)
        libcrypto.so.3 => /data/home/gaowanlu/local/openssl-3.5.4/lib64/libcrypto.so.3 (0x00007fce58c8d000)
        libavant-llhttp.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-llhttp.so (0x00007fce58a72000)
        libavant-inifile.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-inifile.so (0x00007fce58853000)
        libavant-log.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-log.so (0x00007fce58613000)
        libavant-ipc-udp.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-ipc-udp.so (0x00007fce58409000)
        libavant-timer.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-timer.so (0x00007fce581f3000)
        libavant-xml.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-xml.so (0x00007fce57fd7000)
        libavant-buffer.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-buffer.so (0x00007fce57dd3000)
        libavant-lua.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-lua.so (0x00007fce57b7e000)
        libavant-zlib.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-zlib.so (0x00007fce5795b000)
        libavant-json.so => /data/home/gaowanlu/github_rep/avant-main/build/external/libavant-json.so (0x00007fce5773a000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fce57532000)
        libstdc++.so.6 => /data/home/gaowanlu/local/gcc-15.2.0/lib64/libstdc++.so.6 (0x00007fce570b4000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fce56db2000)
        libgcc_s.so.1 => /data/home/gaowanlu/local/gcc-15.2.0/lib64/libgcc_s.so.1 (0x00007fce56b86000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fce567b8000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fce5a17d000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fce565a2000)
        libutf8_validity.so.33.2.0 => /data/home/gaowanlu/local/protobuf/lib64/libutf8_validity.so.33.2.0 (0x00007fce563a0000)
```

上面可以看见可执行文件avant链接了 libstdc++.so.6

在使用g++编译C++代码时，编译器会自动做一些特殊的处理，例如：

* 链接C++标准库：G++会自动链接 `libstdc++`，这对C++程序至关重要。
* 处理C++特性：G++负责处理C++语言中的复杂特性，如类、继承、模板等。

例如，在命令行中使用g++编译一个C++文件：

```bash
g++ main.cpp -o main
```

这条命令会完成以下几个步骤：

1. 预处理：包括宏替换、头文件展开等。
2. 编译：将C++源代码转换为汇编代码。
3. 汇编：将汇编代码转换为机器码。
4. 链接：将 `libstdc++` 等必要的库链接到最终的可执行文件中。

## glibc(GNU C Library)

glibc是GNU操作系统中的标准C库，广泛应用于Linux系统中，它提供了C语言编程中常用的函数库，包含了许多系统调用的封装、 内存管理、线程管理、文件操作等功能。glibc是C语言和操作系统之间的桥梁。

在使用C语言编程时，glibc为程序提供了大量的标准函数，如 printf、malloc、free、fopen等。它使得开发者能够更高效地编写跨平台代码， 而不必直接与操作系统交互。

glibc的作用包括：

* 系统调用封装：通过glic,程序可以调用操作系统提供的系统调用（如I/O、内存管理、进程控制等），而不需要开发者直接操作系统API。
* 标准C库函数实现：如 maloc、free、printf等，glibc提供了标准C库函数的实现。
* 线程支持：glibc还提供了POSIX线程(pthreads)的支持，使得程序可以并发执行。

## libstdc++(GNU Standard C++ Library)

libstdc++是GNU项目提供的C++标准库的实现。它为C++程序提供了基础的类库支持，包括常见的数据结构（如 vector、list、map等）以及输入输出流（如 iostream）。

C++标准库是C++程序员进行开发时不可或缺的工具，它提供了：

* 标准模板库（STL）：包括容器、算法和迭代器等，极大地提高了开发效率。
* 输入输出流：例如 `std::cin` `std::cout` 等，使得C++程序可以方便地进行输入输出操作。
* 数值计算支持：提供了大量数学函数，如 pow、sqrt等。

libstdc++ 是与G++一起使用的。它会在编译C++代码时自动链接进最终地可执行文件。

## GCC、G++、glibc、libstdc++的关系

这四者之间的关系如下：

1. GCC和G++：gcc和g++是同一个编译器工具集的一部分，二者的主要区别在于，gcc用于C语言的编译，而g++用于C++语言的编译，g++会自动链接C++标准库(libstdc++)而gcc不会。
2. GCC、G++和glibc：GCC和G++会使用glibc提供的系统调用封装和标准函数。也就是说，glibc是编译器（GCC、G++）以来的底层库，提供了如内存管理、输入输出操作等基本功能。
3. G++和libstdc++：g++编译C++程序时，会自动链接libstdc++，而gcc则不会。libstdc++为C++提供了标准的类库和数据结构，是C++程序不可或缺的部分。
