基础概念——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編譯器套裝)
總結
以上是生活随笔為你收集整理的基础概念——C标准、C运行库和glibc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 隆安东路186弄邮政编码是多少?
- 下一篇: 无线WIFI连接方法如何设置电脑的无线连