Linux編譯工具演化
1.gcc/g++
GNU編譯器套裝(英語:GNU Compiler Collection,縮寫為GCC)肴敛,一套編程語言編譯器署海,以GPL及LGPL許可證所發(fā)行的自由軟件,也是GNU項(xiàng)目的關(guān)鍵部分医男,也是GNU工具鏈的主要組成部分之一砸狞。GCC(特別是其中的C語言編譯器)也常被認(rèn)為是跨平臺編譯器的事實(shí)標(biāo)準(zhǔn)。1985年由理查德·馬修·斯托曼開始發(fā)展昨登,現(xiàn)在由自由軟件基金會負(fù)責(zé)維護(hù)工作趾代。
原名為GNU C語言編譯器(GNU C Compiler),因?yàn)樗局荒芴幚鞢語言丰辣。GCC很快地?cái)U(kuò)展撒强,變得可處理C++。之后也變得可處理Fortran笙什、Pascal飘哨、Objective-C、Java琐凭、Ada芽隆,以及Go與其他語言。
許多操作系統(tǒng),包括許多類Unix系統(tǒng)胚吁,如Linux及BSD家族都采用GCC作為標(biāo)準(zhǔn)編譯器牙躺。蘋果電腦預(yù)裝的Mac OS X操作系統(tǒng)也采用這個編譯器。
GCC原本用C開發(fā)腕扶,后來因?yàn)長LVM孽拷、Clang的崛起,它更快地將開發(fā)語言轉(zhuǎn)換為C++半抱。許多C的愛好者在對C++一知半解的情況下主觀認(rèn)定C++的性能一定會輸給C脓恕,但是Taylor給出了不同的意見,并表明C++不但性能不輸給C窿侈,而且能設(shè)計(jì)出更好炼幔,更容易維護(hù)的程序[(GCC's move to C++)。gcc--wiki
gcc應(yīng)該是Linux系統(tǒng)中最基礎(chǔ)的編譯方式了史简,后來演化出的makefile乃秀、cmake等等最后也轉(zhuǎn)化成了相應(yīng)的gcc命令來執(zhí)行,對于test.cc
乘瓤,gcc的一步到位的命令如下
gcc test.c -o test
實(shí)際上环形,這個過程經(jīng)過了預(yù)編譯,編譯衙傀,匯編,鏈接四個步驟萨咕,具體解釋可以參見Linux GCC常用命令统抬,但是每次編譯都需要輸入命令行太麻煩了,于是可以使用make命令危队。
2.make
在軟件開發(fā)中聪建,make是一個工具程序(Utility software),經(jīng)由讀取叫做“makefile”的文件茫陆,自動化建構(gòu)軟件金麸。它是一種轉(zhuǎn)化文件形式的工具,轉(zhuǎn)換的目標(biāo)稱為“target”簿盅;與此同時挥下,它也檢查文件的依賴關(guān)系,如果需要的話桨醋,它會調(diào)用一些外部軟件來完成任務(wù)棚瘟。它的依賴關(guān)系檢查系統(tǒng)非常簡單,主要根據(jù)依賴文件的修改時間進(jìn)行判斷喜最。大多數(shù)情況下偎蘸,它被用來編譯源代碼,生成結(jié)果代碼,然后把結(jié)果代碼連接起來生成可執(zhí)行文件或者庫文件迷雪。它使用叫做“makefile”的文件來確定一個target文件的依賴關(guān)系限书,然后把生成這個target的相關(guān)命令傳給shell去執(zhí)行。make--wiki
make命令的一般使用方式是先讀取相關(guān)系統(tǒng)配置章咧,之后使用make進(jìn)行編譯倦西,等待編譯完成以后將相關(guān)庫文件或者可執(zhí)行文件安裝到系統(tǒng)路徑。
./configure
make
sudo make install
一個makefile的教程慧邮,跟我一起寫Makefile调限。使用makefile也會產(chǎn)生一個問題,會在源代碼所在目錄產(chǎn)生許多中間文件误澳,雖然可以使用make clean
進(jìn)行刪除耻矮,但還是很麻煩,而且makefile的抽象程度并不高忆谓,所以產(chǎn)生了裆装,cmake、autotools等高度抽象工具倡缠,cmake還能在不污染源代碼目錄的情況下進(jìn)行編譯哨免,所以很多開源項(xiàng)目開始采用cmake的方式進(jìn)行編譯。
3.cmake/qmake
CMake前面已經(jīng)介紹過了昙沦,不再贅述琢唾。
qmake是編譯Qt項(xiàng)目時用的,但是不如CMake好用盾饮。
其實(shí)cmake等工具也是生成makefile的方式進(jìn)行編譯項(xiàng)目采桃,在執(zhí)行cmake ..
命令以后可以在build
目錄下發(fā)現(xiàn)makefile文件。
4.二進(jìn)制分發(fā)
顧名思義丘损,就是直接將編譯好的可執(zhí)行程序或者動態(tài)庫拷貝到生產(chǎn)環(huán)境中普办,這種情況下的部署速度應(yīng)該只有網(wǎng)速或者U盤讀取速度有關(guān)了,缺點(diǎn)也很明顯徘钥,需要保證開發(fā)環(huán)境與生產(chǎn)環(huán)境的基本一致衔蹲,需要保證依賴庫在生產(chǎn)環(huán)境中存在。
5.git
git是一個分布式的版本管理工具呈础,也是目前最流行的版本管理工具舆驶,同時github也成為了目前最流行的項(xiàng)目托管平臺,同時gitlab猪落、gitea等開源工具也能用來搭建私人的項(xiàng)目托管服務(wù)器贞远,所以git也可以算是一個很方便的分發(fā)、部署工具笨忌,對于一般項(xiàng)目蓝仲,只需要短短幾行代碼就能從源碼進(jìn)行構(gòu)建。
面對一個全新的環(huán)境,我們完全可以用這種方法進(jìn)行軟件分發(fā)袱结,項(xiàng)目部署亮隙,但是缺點(diǎn)也很明顯,每次都需要從源碼進(jìn)行構(gòu)建垢夹,在項(xiàng)目較大或者計(jì)算機(jī)性能不足夠的時候費(fèi)時費(fèi)力溢吻。
git clone http://path/to/test.git
cd test
mkdir build
cd build
cmake .. && make && sudo make install
6.包管理
軟件包管理系統(tǒng)是在電腦中自動安裝、配制果元、卸載和升級軟件包的工具組合促王,在各種系統(tǒng)軟件和應(yīng)用軟件的安裝管理中均有廣泛應(yīng)用。
在Linux發(fā)行版中而晒,幾乎每一個發(fā)行版都有自己的軟件包管理系統(tǒng)蝇狼。常見的有:
- 管理deb軟件包的dpkg以及它的前端apt(使用于Debian、Ubuntu)倡怎。
- RPM套件管理員以及它的前端dnf(使用于Fedora)迅耘、前端yum(使用于Red Hat Enterprise Linux)、前端ZYpp(使用于openSUSE)监署、前端urpmi(使用于Mandriva Linux颤专、Mageia)等。使用軟件包管理系統(tǒng)將大大簡化在Linux發(fā)行版中安裝軟件的過程钠乏。軟件包管理系統(tǒng)---wiki
使用cpack進(jìn)行打包栖秕,會在deb包中添加相關(guān)的依信息,參考這篇文章晓避。優(yōu)點(diǎn)很明顯累魔,解決了二進(jìn)制分發(fā)的依賴的問題,只要在包信息中添加相關(guān)信息够滑,會在部署時自動安裝相關(guān)依賴,也解決了源碼分發(fā)的速度問題吕世,缺點(diǎn)也很明顯彰触,如果目標(biāo)系統(tǒng)中沒有包管理系統(tǒng),就GG了命辖。所以產(chǎn)生了另一種分發(fā)機(jī)制况毅,鏡像分發(fā),其中比較流行的是docker尔艇。
7.docker
詳細(xì)介紹參見docker--gitbook尔许。
docker的實(shí)質(zhì)是一種虛擬化技術(shù),傳統(tǒng)的虛擬化技術(shù)是在宿主機(jī)虛擬出一套完整的硬件后運(yùn)行一個完整的操作系統(tǒng)终娃,并在該虛擬系統(tǒng)中運(yùn)行所需應(yīng)用味廊,而docker直接運(yùn)行與宿主內(nèi)核,相比傳統(tǒng)虛擬機(jī)更為輕便。
如果通過docker進(jìn)行分發(fā)余佛,只需要在相應(yīng)的docker鏡像中編譯相應(yīng)的程序以及依賴庫柠新,然后將鏡像推送到服務(wù)器上,在開發(fā)環(huán)境中進(jìn)行下載即可辉巡,這種方式對需要大規(guī)模部署的項(xiàng)目來說恨憎,效率很高,而且更加易于維護(hù)和擴(kuò)展郊楣。