zoukankan      html  css  js  c++  java
  • 基础概念——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或使用其他的库。



    这里讲讲GNUGCC:
    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编译器套装

  • 相关阅读:
    Mysql基础(十二):sql语句执行步骤详解(一)准备工作
    JVM 专题二十三:面试题(一)
    leetcode算法题基础(三十八) 并查集(二)547. 朋友圈
    leetcode算法题基础(三十七) 并查集(一)200 岛屿数量
    leetcode算法题基础(三十六)动态规划(四)91. 解码方法
    leetcode算法题基础(三十五)动态规划(三)5. 最长回文子串
    leetcode算法题基础(三十四)动态规划(二)121. 买卖股票的最佳时机
    Virtio-vsock Device + aF_UNIX 套接字通信
    Using the Firecracker Virtio-vsock Device + F_UNIX 套接字通信
    vhost-user
  • 原文地址:https://www.cnblogs.com/grooovvve/p/12907659.html
Copyright © 2011-2022 走看看