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本身包括多个编译器,最常用的有:

G++(GNU C++ Compiler)

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

[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++代码时,编译器会自动做一些特殊的处理,例如:

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

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的作用包括:

libstdc++(GNU Standard C++ Library)

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

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

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++程序不可或缺的部分。