基础概念——C标准、C运行库和glibc
C標(biāo)準(zhǔn):
C 標(biāo)準(zhǔn)主要由兩部分組成,一部分描述C的語(yǔ)法,另一部分描述C標(biāo)準(zhǔn)庫(kù)(描述了一些C標(biāo)準(zhǔn)函數(shù)的原型,但是不提供實(shí)現(xiàn))。
C標(biāo)準(zhǔn)庫(kù)定義了一組標(biāo)準(zhǔn)頭文件,每個(gè)頭文件中包含一些相關(guān)的函數(shù)、變量、類型聲明和宏定義。
常見的C標(biāo)準(zhǔn)就是ANSI C;美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì);
為了提高C語(yǔ)言的開發(fā)效率,C標(biāo)準(zhǔn)定義了一系列常用的函數(shù),稱為C標(biāo)準(zhǔn)庫(kù)函數(shù)。
應(yīng)用程序開發(fā)者可以包含這些標(biāo)準(zhǔn)函數(shù)的頭文件,來(lái)調(diào)用這些C標(biāo)準(zhǔn)函數(shù),來(lái)開發(fā)應(yīng)用,這樣就可以屏蔽平臺(tái)的差異;
C運(yùn)行庫(kù):
C標(biāo)準(zhǔn)庫(kù)函數(shù)的實(shí)現(xiàn)留給了各個(gè)系統(tǒng)平臺(tái);
這個(gè)實(shí)現(xiàn)就是C運(yùn)行時(shí)庫(kù)(C Run Time Libray) ,簡(jiǎn)稱CRT;
C運(yùn)行庫(kù),是和平臺(tái)相關(guān)的,即和操作系統(tǒng)相關(guān)的;
C運(yùn)行庫(kù)(CRT)從某種程度上來(lái)講是C語(yǔ)言的程序和不同操作系統(tǒng)平臺(tái)之間的抽象層;//接口是統(tǒng)一的標(biāo)準(zhǔn),實(shí)現(xiàn)由各個(gè)平臺(tái)自己實(shí)現(xiàn);
Linux和Windows平臺(tái)下的兩個(gè)主要C語(yǔ)言運(yùn)行庫(kù)分別為
glibc(GNU C Library)和MSVCRT(Microsoft Visual C Run-time)。
值得注意的是,像線程操作這樣的功能并不是標(biāo)準(zhǔn)的C語(yǔ)言運(yùn)行庫(kù)的一部分,
但是glibc和MSVCRT都包含了線程操作的庫(kù)函數(shù)。所以glibc和MSVCRT事實(shí)上是標(biāo)準(zhǔn)C語(yǔ)言運(yùn)行庫(kù)的超集,
它們各自對(duì)C標(biāo)準(zhǔn)庫(kù)進(jìn)行了一些擴(kuò)展。
也就是說(shuō)CRT實(shí)際上包含兩部分,一部分實(shí)現(xiàn)是基于C標(biāo)準(zhǔn)庫(kù)來(lái)的,一部分實(shí)現(xiàn)是根據(jù)平臺(tái)自身開發(fā)的庫(kù);
某種程度上是C運(yùn)行庫(kù)是C標(biāo)準(zhǔn)庫(kù)的一個(gè)擴(kuò)展庫(kù),加了很多C標(biāo)準(zhǔn)庫(kù)所沒(méi)有的與平臺(tái)相關(guān)的或者不相關(guān)的庫(kù)接口函數(shù)。
要在一個(gè)平臺(tái)上支持C語(yǔ)言,不僅要實(shí)現(xiàn)符合平臺(tái)的C編譯器,還要實(shí)現(xiàn)C標(biāo)準(zhǔn)庫(kù),這樣的實(shí)現(xiàn)才算符合C標(biāo)準(zhǔn)。
glibc:
這里以linux系統(tǒng)為例進(jìn)行討論;在Linux平臺(tái)上最廣泛使用的C運(yùn)行庫(kù)是glibc,其中包括C標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn),也包括所有系統(tǒng)函數(shù)。
幾乎所有C程序都要調(diào)用glibc的庫(kù)函數(shù),所以glibc是Linux平臺(tái)C程序運(yùn)行的基礎(chǔ)。
GNU C:GNU C實(shí)際上是GNU C庫(kù),又稱為glibc,即c運(yùn)行庫(kù);
最基本、最常用的C標(biāo)準(zhǔn)庫(kù)函數(shù)和系統(tǒng)函數(shù)在libc.so庫(kù)文件中,幾乎所有C程序的運(yùn)行都依賴于libc.so
有些做數(shù)學(xué)計(jì)算的C程序依賴于libm.so,
多線程的C程序依賴于libpthread.so。
libc有時(shí)時(shí)專指libc.so這個(gè)庫(kù)文件,而說(shuō)glibc時(shí)指的是glibc提供的所有庫(kù)文件。
值得注意的是,像線程操作這樣的功能并不是C標(biāo)準(zhǔn)庫(kù)的一部分(也就是說(shuō)C標(biāo)準(zhǔn)沒(méi)有定義線程操作相關(guān)的函數(shù)原型);
但是glibc和MSVCRT(Windows系統(tǒng)下的C運(yùn)行庫(kù))都包含了線程操作的庫(kù)函數(shù)。
比如glibc有一個(gè)可選的pthread庫(kù)中的pthread_create()函數(shù)可以用來(lái)創(chuàng)建線程;
而MSVCRT中可以使用_beginthread()函數(shù)來(lái)創(chuàng)建線程。
所以glibc和MSVCRT事實(shí)上是標(biāo)準(zhǔn)C語(yǔ)言運(yùn)行庫(kù)的超集,它們各自對(duì)C標(biāo)準(zhǔn)庫(kù)進(jìn)行了一些擴(kuò)展。
glibc的發(fā)布版本主要由兩部分組成,一部分是頭文件,比如stdio.h、stdlib.h等,它們往往位于/usr/include;
另外一部分則是庫(kù)的二進(jìn)制文件部分。二進(jìn)制部分主要的就是C語(yǔ)言標(biāo)準(zhǔn)庫(kù),它有靜態(tài)和動(dòng)態(tài)兩個(gè)版本。
動(dòng)態(tài)的標(biāo)準(zhǔn)庫(kù)我們及在本書的前面章節(jié)中碰到過(guò)了,它位于/lib/libc.so.6;而靜態(tài)標(biāo)準(zhǔn)庫(kù)位于/usr/lib/libc.a。
事實(shí)上glibc除了C標(biāo)準(zhǔn)庫(kù)之外,還有幾個(gè)輔助程序運(yùn)行的運(yùn)行庫(kù),這幾個(gè)文件可以稱得上是真正的“運(yùn)行庫(kù)”。
它們就是/usr/lib/crt1.o、/usr/lib/crti.o和/usr/lib/crtn.o。
比如我們可以在不同的操作系統(tǒng)平臺(tái)下使用fread來(lái)讀取文件,
而事實(shí)上fread在不同的操作系統(tǒng)平臺(tái)下的實(shí)現(xiàn)是不同的,
但作為運(yùn)行庫(kù)的使用者我們不需要關(guān)心這一點(diǎn)。
雖然各個(gè)平臺(tái)下的C語(yǔ)言運(yùn)行庫(kù)提供了很多功能,但很多時(shí)候它們畢竟有限,
比如用戶的權(quán)限控制、操作系統(tǒng)線程創(chuàng)建等都不是屬于標(biāo)準(zhǔn)的C語(yǔ)言運(yùn)行庫(kù)。
于是我們不得不通過(guò)其他的辦法,諸如繞過(guò)C語(yǔ)言運(yùn)行庫(kù)直接調(diào)用操作系統(tǒng)API或使用其他的庫(kù)。
這里講講GNUGCC:
GNU軟件包列表:該系統(tǒng)的基本組成包括GNU編譯器套裝(GCC)、GNU的C庫(kù)(glibc)、以及GNU核心工具組(coreutils)、(GDB)。
GCC原名GNU C Compiler,后來(lái)逐漸支持更多的語(yǔ)言編譯(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),
所以變成了GNU Compiler Collection(GNU編譯器套裝)
總結(jié)
以上是生活随笔為你收集整理的基础概念——C标准、C运行库和glibc的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 隆安东路186弄邮政编码是多少?
- 下一篇: 无线WIFI连接方法如何设置电脑的无线连