Linux源码编译(一):从头文件说起
生活随笔
收集整理的這篇文章主要介紹了
Linux源码编译(一):从头文件说起
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Linux源碼編譯(一):從頭文件說(shuō)起
2013-04-10 14:37:24
在這一節(jié)里,主要和大家理一理Linux下頭文件方面的雜碎,從大的方向說(shuō),Linux下編程分為兩塊:
? 1). 內(nèi)核開(kāi)發(fā)
? 2). 用戶(hù)空間程序開(kāi)發(fā)
? 1. 內(nèi)核空間頭文件
對(duì)于 Linux kernel的程序開(kāi)發(fā),主要使用C語(yǔ)言,當(dāng)然匯編語(yǔ)言也是舉足輕重,Kernel的開(kāi)發(fā)主要針對(duì)哪些方面呢?
? 1). 硬件驅(qū)動(dòng)模塊
? 2). 內(nèi)核性能的增強(qiáng)
? 3). 內(nèi)核的新功能、新特性
? 4). 內(nèi)核bug的fix
? ......
無(wú)論是哪一方面的內(nèi)核開(kāi)發(fā),使用的都是內(nèi)核自身的頭文件,而內(nèi)核的頭文件主要有兩個(gè)目錄位置:
當(dāng)然,除了asm和 linux 這兩個(gè)主要的頭文件目錄,還有諸如/usr/include/drm,/usr/include/video,/usr/include/sound等驅(qū)動(dòng)相關(guān)的頭文件目錄。
總之,如果是從事內(nèi)核開(kāi)發(fā)的話,所有引用的頭文件均是來(lái)自?xún)?nèi)核本身,絕不可能使用用戶(hù)空間的頭文件,比如"glibc",“l(fā)ibstdc++"等頭文件的引用是不可能出現(xiàn)在內(nèi)核程序中的。
2. 用戶(hù)空間頭文件
用戶(hù)空間的頭文件雜亂紛繁,隨便一個(gè)應(yīng)用程序,幾乎都有自己維護(hù)的頭文件,但盡管如此,有一些最基本、相對(duì)底層的頭文件或庫(kù)函數(shù)是開(kāi)發(fā)應(yīng)用程序的基礎(chǔ)。
比如,如果想在用戶(hù)空間編寫(xiě)C語(yǔ)言程序,那么使用的最基本的C庫(kù)和頭文件是由glibc提供的;想在用戶(hù)空間編寫(xiě)C++程序,其使用的基本庫(kù)和頭文件又是來(lái)自于libstdc++。
對(duì)于glibc,不僅僅提供了標(biāo)準(zhǔn)的C庫(kù),如fopen(), fclose()等, 而且還提供了和內(nèi)核空間打交道的相關(guān)庫(kù),如open(), close()等。
不管是glibc提供的C庫(kù),還是由libstdc++提供的C++庫(kù),想要編寫(xiě)GUI窗口程序,顯然不太現(xiàn)實(shí),于是,有了著名的基于C語(yǔ)言的GTK+庫(kù)和基于C++語(yǔ)言的QT庫(kù),這些相對(duì)上層的庫(kù)所做的事情就是為了方便編寫(xiě)GUI程序,對(duì)C和C++封裝了一層。
除了上面這些編程相關(guān)的庫(kù)或頭文件,Linux環(huán)境中編程還有很多編程語(yǔ)言,比如Java,Python等。
3. 所謂跨平臺(tái)
?1). 跨平臺(tái)一般分為:
????? 跨硬件平臺(tái):比如Linux內(nèi)核,即能在x86上運(yùn)行,也能在ARM或Android上運(yùn)行
????? 跨系統(tǒng)平臺(tái):即能在Linux系統(tǒng)下運(yùn)行,也能在Windows系統(tǒng)下運(yùn)行,比如firefox
????? 跨硬件跨系統(tǒng):比如Java程序,可以在不同的體系結(jié)構(gòu),也可以在不同的系統(tǒng)平臺(tái)運(yùn)行
?2). Window環(huán)境中重新編譯,才能運(yùn)行,其原理是使用標(biāo)準(zhǔn)庫(kù)編寫(xiě)程序,從而實(shí)現(xiàn)跨平臺(tái):
????? glibc:Linux標(biāo)準(zhǔn)C庫(kù)
????? libstdc++:Linux標(biāo)準(zhǔn)C++庫(kù)
?3). Windows環(huán)境中重新編譯,才能運(yùn)行,其原理是統(tǒng)一不同系統(tǒng)平臺(tái)的鏈接庫(kù),從而實(shí)現(xiàn)跨平臺(tái):
????? GTK+:基于C語(yǔ)言的GUI庫(kù)
????? Qt: 基于C++的GUI庫(kù)
?4). Windows環(huán)境中不需要重新編譯,一次編譯,到處運(yùn)行:
????? Java,使用JVM虛擬機(jī)統(tǒng)一不同的鏈接庫(kù)和不同的平臺(tái),從而實(shí)現(xiàn)跨平臺(tái)。
分類(lèi): LINUX
在Linux體系結(jié)構(gòu)章節(jié)中,主要讓大家對(duì)Linux結(jié)構(gòu)層次有一定的了解,沒(méi)有過(guò)多的長(zhǎng)篇大論,力求簡(jiǎn)結(jié),但其中的每一個(gè)細(xì)節(jié)要點(diǎn)都值得花費(fèi)很多時(shí)間去研究,比如X window架構(gòu),驅(qū)動(dòng)模塊,文件系統(tǒng)的實(shí)現(xiàn)等。對(duì)于細(xì)節(jié),只能靠大家自己去沉淀和深究,本博客旨在從全局概念上讓大家對(duì)Linux有更多的認(rèn)知,系列文章講完后,希望留給大家的感覺(jué)是:不再害怕Linux。在這一節(jié)里,主要和大家理一理Linux下頭文件方面的雜碎,從大的方向說(shuō),Linux下編程分為兩塊:
? 1). 內(nèi)核開(kāi)發(fā)
? 2). 用戶(hù)空間程序開(kāi)發(fā)
? 1. 內(nèi)核空間頭文件
對(duì)于 Linux kernel的程序開(kāi)發(fā),主要使用C語(yǔ)言,當(dāng)然匯編語(yǔ)言也是舉足輕重,Kernel的開(kāi)發(fā)主要針對(duì)哪些方面呢?
? 1). 硬件驅(qū)動(dòng)模塊
? 2). 內(nèi)核性能的增強(qiáng)
? 3). 內(nèi)核的新功能、新特性
? 4). 內(nèi)核bug的fix
? ......
無(wú)論是哪一方面的內(nèi)核開(kāi)發(fā),使用的都是內(nèi)核自身的頭文件,而內(nèi)核的頭文件主要有兩個(gè)目錄位置:
當(dāng)然,除了asm和 linux 這兩個(gè)主要的頭文件目錄,還有諸如/usr/include/drm,/usr/include/video,/usr/include/sound等驅(qū)動(dòng)相關(guān)的頭文件目錄。
總之,如果是從事內(nèi)核開(kāi)發(fā)的話,所有引用的頭文件均是來(lái)自?xún)?nèi)核本身,絕不可能使用用戶(hù)空間的頭文件,比如"glibc",“l(fā)ibstdc++"等頭文件的引用是不可能出現(xiàn)在內(nèi)核程序中的。
2. 用戶(hù)空間頭文件
用戶(hù)空間的頭文件雜亂紛繁,隨便一個(gè)應(yīng)用程序,幾乎都有自己維護(hù)的頭文件,但盡管如此,有一些最基本、相對(duì)底層的頭文件或庫(kù)函數(shù)是開(kāi)發(fā)應(yīng)用程序的基礎(chǔ)。
比如,如果想在用戶(hù)空間編寫(xiě)C語(yǔ)言程序,那么使用的最基本的C庫(kù)和頭文件是由glibc提供的;想在用戶(hù)空間編寫(xiě)C++程序,其使用的基本庫(kù)和頭文件又是來(lái)自于libstdc++。
對(duì)于glibc,不僅僅提供了標(biāo)準(zhǔn)的C庫(kù),如fopen(), fclose()等, 而且還提供了和內(nèi)核空間打交道的相關(guān)庫(kù),如open(), close()等。
不管是glibc提供的C庫(kù),還是由libstdc++提供的C++庫(kù),想要編寫(xiě)GUI窗口程序,顯然不太現(xiàn)實(shí),于是,有了著名的基于C語(yǔ)言的GTK+庫(kù)和基于C++語(yǔ)言的QT庫(kù),這些相對(duì)上層的庫(kù)所做的事情就是為了方便編寫(xiě)GUI程序,對(duì)C和C++封裝了一層。
除了上面這些編程相關(guān)的庫(kù)或頭文件,Linux環(huán)境中編程還有很多編程語(yǔ)言,比如Java,Python等。
3. 所謂跨平臺(tái)
?1). 跨平臺(tái)一般分為:
????? 跨硬件平臺(tái):比如Linux內(nèi)核,即能在x86上運(yùn)行,也能在ARM或Android上運(yùn)行
????? 跨系統(tǒng)平臺(tái):即能在Linux系統(tǒng)下運(yùn)行,也能在Windows系統(tǒng)下運(yùn)行,比如firefox
????? 跨硬件跨系統(tǒng):比如Java程序,可以在不同的體系結(jié)構(gòu),也可以在不同的系統(tǒng)平臺(tái)運(yùn)行
?2). Window環(huán)境中重新編譯,才能運(yùn)行,其原理是使用標(biāo)準(zhǔn)庫(kù)編寫(xiě)程序,從而實(shí)現(xiàn)跨平臺(tái):
????? glibc:Linux標(biāo)準(zhǔn)C庫(kù)
????? libstdc++:Linux標(biāo)準(zhǔn)C++庫(kù)
?3). Windows環(huán)境中重新編譯,才能運(yùn)行,其原理是統(tǒng)一不同系統(tǒng)平臺(tái)的鏈接庫(kù),從而實(shí)現(xiàn)跨平臺(tái):
????? GTK+:基于C語(yǔ)言的GUI庫(kù)
????? Qt: 基于C++的GUI庫(kù)
?4). Windows環(huán)境中不需要重新編譯,一次編譯,到處運(yùn)行:
????? Java,使用JVM虛擬機(jī)統(tǒng)一不同的鏈接庫(kù)和不同的平臺(tái),從而實(shí)現(xiàn)跨平臺(tái)。
總結(jié)
以上是生活随笔為你收集整理的Linux源码编译(一):从头文件说起的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 反距离权重加权插值的理解及Python实
- 下一篇: 这篇Nature子刊文章的蛋白组学数据P