在编程的世界里,特别是在C和C++编程中,GCC、G++、glibc和libstdc++是几个非常关键的工具和库,了解它们之间的关系可以帮助我们更好地理解如何进行编译、链接和运行程序。
GCC是GNU Compiler Collection(GNU编译器集合)的缩写。它是一个开源的编译器套件,支持多种编程语言,包括C、C++、Fortan、Ada等。 GCC是开发和C++程序时最长用的编译器之一。其核心功能包括:
GCC本身包括多个编译器,最常用的有:
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++代码时,编译器会自动做一些特殊的处理,例如:
libstdc++,这对C++程序至关重要。例如,在命令行中使用g++编译一个C++文件:
g++ main.cpp -o main这条命令会完成以下几个步骤:
libstdc++
等必要的库链接到最终的可执行文件中。glibc是GNU操作系统中的标准C库,广泛应用于Linux系统中,它提供了C语言编程中常用的函数库,包含了许多系统调用的封装、 内存管理、线程管理、文件操作等功能。glibc是C语言和操作系统之间的桥梁。
在使用C语言编程时,glibc为程序提供了大量的标准函数,如 printf、malloc、free、fopen等。它使得开发者能够更高效地编写跨平台代码, 而不必直接与操作系统交互。
glibc的作用包括:
libstdc++是GNU项目提供的C++标准库的实现。它为C++程序提供了基础的类库支持,包括常见的数据结构(如 vector、list、map等)以及输入输出流(如 iostream)。
C++标准库是C++程序员进行开发时不可或缺的工具,它提供了:
std::cin std::cout
等,使得C++程序可以方便地进行输入输出操作。libstdc++ 是与G++一起使用的。它会在编译C++代码时自动链接进最终地可执行文件。
这四者之间的关系如下: