今天我們將深入探討一些更高級的linux知識,具體來說是關(guān)于linux c程序的構(gòu)建。
在日常的IT生活中,我們經(jīng)常需要在源碼環(huán)境下編譯并安裝軟件。這也是開源軟件的一個顯著特點,而Windows中的閉源軟件通常不提供這種源碼編譯安裝的方式。
程序的構(gòu)建過程通常會經(jīng)歷以下幾個階段:
配置
配置階段的目的是檢查當(dāng)前環(huán)境是否滿足安裝該軟件的依賴關(guān)系。這可以被視為開源軟件的一個缺點,因為開源軟件的開發(fā)者通常使用其他開源庫或工具來構(gòu)建自己的程序。當(dāng)我們想要運行他們的軟件時,就需要檢查我們的系統(tǒng)中是否已經(jīng)安裝了這些庫或工具。
此外,配置階段還包括設(shè)置一些安裝必需的信息,如安裝路徑、需要安裝的組件等。配置完成后,會生成一個Makefile文件,供下一步的make命令使用。
開源軟件的開發(fā)者通常會提供一個configure文件,這個文件是通過autotool等工具生成的。關(guān)于configure文件的生成涉及到其他工具的使用和C/c++的知識,這里就不深入介紹了。
我們可以通過以下命令查看configure文件的可用選項:
./configure --help
或者我們可以配置程序的安裝路徑:
./configure --prefix=/usr/local/my
通常,我建議直接使用開發(fā)者默認的配置:
./configure
這樣,程序會自動檢測我們的系統(tǒng)環(huán)境,并列出我們?nèi)鄙俚奈募?/p>
我們以一個名為Shadow的軟件為例進行演示。
從開發(fā)者的網(wǎng)站下載并解壓這個軟件后,進入目錄,你會發(fā)現(xiàn)里面的結(jié)構(gòu)大致如下。
按照上述步驟執(zhí)行 ./configure 看看:
之后你會看到,configure文件開始檢測系統(tǒng)環(huán)境是否滿足安裝需求。
通常,開發(fā)者會在其gitHub頁面上列出需要安裝的依賴包,我們可以根據(jù)我們的系統(tǒng)版本來查找這些依賴。
例如,這里我們可以在github上找到開發(fā)者提供的以下內(nèi)容:
由于我們的系統(tǒng)是Fedora & RHEL類的,所以我們可以點擊這里查看需要安裝的依賴:
安裝完依賴后,再次執(zhí)行 ./configure 就不會出現(xiàn)錯誤了:
(我悄悄換了一臺已經(jīng)安裝好依賴的機器~)
接下來,我們可以進行下一步,編譯。
編譯
顧名思義,編譯就是將源文件進行編譯鏈接生成可執(zhí)行程序。
在執(zhí)行完上述配置步驟后,目錄中會出現(xiàn)一個Makefile文件。
你可能會說,我們之前已經(jīng)看到了Makefile文件了。好的,我們來對比一下執(zhí)行configure前后的區(qū)別。
以下是未執(zhí)行configure之前的,確實有Makefile.am和Makefile.in兩個文件,但它們并不是Makefile。
如果使用過automake的同學(xué)就會清楚這兩個文件的作用(不過這種同學(xué)可能不會來看這種文章哈哈哈):
然后是執(zhí)行完 ./configure 之后的:
已經(jīng)多出了幾個文件,最重要的是有了Makefile這個文件。
我們這里不討論Makefile是如何編寫的,這個比較復(fù)雜,一般需要寫c語言超過一年以上的同學(xué)才能完全理解,而且對于用戶來說,沒必要知道程序的編譯過程。
需要注意的是,Linux中的make命令會自動在當(dāng)前目錄下查找名為Makefile或makefile的文件來加載。
對于依賴較少且代碼結(jié)構(gòu)簡單的代碼,可以手動編寫Makefile,這樣可以省去第一步的配置工作。
但是對于依賴較多且代碼結(jié)構(gòu)復(fù)雜的項目,最好還是使用程序自動生成的Makefile。
這里簡單介紹一下在Linux下編譯文件。
假設(shè)我們有一個名為linux-test.c的C文件,如何編譯它?
可以使用gcc命令:
gcc linux-test.c -o lt
這里的linux-test.c是我們編寫的代碼,-o之后接的是我們希望編譯后程序的名字,這里是lt。
如果你編寫的是C++代碼,要使用g++命令。
好了,我們繼續(xù)編譯。一個文件我們可以用gcc,但是一堆文件的編譯,我們就需要用到make了。
現(xiàn)在我們有了Makefile文件,我們就可以執(zhí)行make了:
這樣,程序就會自動鏈接和編譯文件了。
最后等待一會兒,編譯完成。
安裝
在Linux中,安裝就簡單多了。如果你完成了上述幾個步驟,只需將生成的可執(zhí)行程序復(fù)制到你想要的地方即可。
但是我們有一個簡單的命令:
make install
其實install是Makefile中的一個規(guī)則,我們可以打開Makefile來查看或編輯,但這是不建議的。
之后,程序就會自動復(fù)制到代碼編寫者指定的地方了。
這樣,我們的程序就安裝完成了。