基础概念——C标准、C运行库和glibc

C标准:
C 标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库(描述了一些C标准函数的原型,但是不提供实现)。
C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义。


常见的C标准就是ANSI C;美国国家标准协会;
为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C标准库函数。
应用程序开发者可以包含这些标准函数的头文件,来调用这些C标准函数,来开发应用,这样就可以屏蔽平台的差异;



C运行库:
C标准库函数的实现留给了各个系统平台;
这个实现就是C运行时库(C Run Time Libray) ,简称CRT
C运行库,是和平台相关的,即和操作系统相关的;
C运行库(CRT)从某种程度上来讲是C语言的程序和不同操作系统平台之间的抽象层;//接口是统一的标准,实现由各个平台自己实现;
Linux和Windows平台下的两个主要C语言运行库分别为
glibc(GNU C Library)和MSVCRT(Microsoft Visual C Run-time)。


值得注意的是,像线程操作这样的功能并不是标准的C语言运行库的一部分,
但是glibc和MSVCRT都包含了线程操作的库函数。所以glibc和MSVCRT事实上是标准C语言运行库的超集,
它们各自对C标准库进行了一些扩展。
也就是说CRT实际上包含两部分,一部分实现是基于C标准库来的,一部分实现是根据平台自身开发的库
某种程度上是C运行库是C标准库的一个扩展库,加了很多C标准库所没有的与平台相关的或者不相关的库接口函数。


要在一个平台上支持C语言,不仅要实现符合平台的C编译器,还要实现C标准库,这样的实现才算符合C标准。



glibc:
这里以linux系统为例进行讨论;在Linux平台上最广泛使用的C运行库是glibc,其中包括C标准库的实现,也包括所有系统函数。
几乎所有C程序都要调用glibc的库函数,所以glibc是Linux平台C程序运行的基础。
GNU C:GNU C实际上是GNU C库,又称为glibc,即c运行库;

最基本、最常用的C标准库函数和系统函数libc.so库文件中,几乎所有C程序的运行都依赖于libc.so
有些做数学计算的C程序依赖于libm.so
多线程的C程序依赖于libpthread.so
libc有时时专指libc.so这个库文件,而说glibc时指的是glibc提供的所有库文件

值得注意的是,像线程操作这样的功能并不是C标准库的一部分(也就是说C标准没有定义线程操作相关的函数原型)
但是glibc和MSVCRT(Windows系统下的C运行库)都包含了线程操作的库函数。
比如glibc有一个可选的pthread库中的pthread_create()函数可以用来创建线程;
而MSVCRT中可以使用_beginthread()函数来创建线程。
所以glibc和MSVCRT事实上是标准C语言运行库的超集它们各自对C标准库进行了一些扩展

glibc的发布版本主要由两部分组成,一部分是头文件,比如stdio.h、stdlib.h等,它们往往位于/usr/include;
另外一部分则是库的二进制文件部分。二进制部分主要的就是C语言标准库,它有静态和动态两个版本。
动态的标准库我们及在本书的前面章节中碰到过了,它位于/lib/libc.so.6;而静态标准库位于/usr/lib/libc.a。

事实上glibc除了C标准库之外,还有几个辅助程序运行的运行库,这几个文件可以称得上是真正的“运行库”。
它们就是/usr/lib/crt1.o、/usr/lib/crti.o和/usr/lib/crtn.o。

比如我们可以在不同的操作系统平台下使用fread来读取文件,
而事实上fread在不同的操作系统平台下的实现是不同的,
但作为运行库的使用者我们不需要关心这一点。
虽然各个平台下的C语言运行库提供了很多功能,但很多时候它们毕竟有限,
比如用户的权限控制、操作系统线程创建等都不是属于标准的C语言运行库。
于是我们不得不通过其他的办法,诸如绕过C语言运行库直接调用操作系统API或使用其他的库。



这里讲讲GNU\GCC:
GNU软件包列表:该系统的基本组成包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及GNU核心工具组(coreutils)、(GDB)。

GCC原名GNU C Compiler,后来逐渐支持更多的语言编译(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),
所以变成了GNU Compiler Collection(GNU编译器套装

猜你喜欢

转载自www.cnblogs.com/grooovvve/p/12907659.html