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