在linux下安裝軟件,難免會碰到需要源碼安裝的,而就是這簡簡單單的./configure、make、sudo make install三步,卻讓不少人頭疼不已,這裡以安裝X11為例具體介紹下我在安裝時的一點小經驗,以便共同學習,共同進步!
首先,我們要做些准備工作,源碼安裝少不了這幾個工具pkg-config、libtool、autoconf和automake(當然,還有更基礎的,像zlib、m4等,這裡就略過啦),其中,pkg-config是相對比較重要的,它就是向configure程序提供系統信息的程序,如軟件的版本、庫的版本以及庫的路徑等信息,這些只是在編譯期間使用。你可以打開/usr/lib/pkgconfig下任意一個.pc文件,就會發現類似下面的信息(X11的pc文件):
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
xthreadlib=-lpthread
Name: X11
Description: X Library
Version: 1.3.3
Requires: xproto kbproto
Requires.private: xcb >= 1.1.92
Cflags: -I${includedir}
Libs: -L${libdir} -lX11
Libs.private: -lpthread
configure就是靠著這些信息來判斷軟件版本是否符合要求的。接著來看看pkg-config是怎樣工作的,缺省情況下,pkg-config首先在usr/lib/pkgconfig/中查找相關包(譬如x11)對應的相應的文件(x11.pc),若沒有找到,它也會到PKG_CONFIG_PATH這個環境變量所指定的路徑下去找,若是還沒有找到,它就會報錯。所以這裡就可以得到一些解決configure時提示**庫未找到的辦法了,先用命令"ldconfig -p | grep 庫名"來分析該庫是否安裝及其路徑,若返回空,則說明該庫確實未安裝,否則,可以根據該命令的返回結果找到庫的安裝地點,然後設置其環境變量,命令如下:
"export PKG_CONFIG_PATH=軟件位置/lib/pkgconfig:$PKG_CONFIG_PATH",這裡有個常識,軟件安裝後,.pc文件都是在安裝目錄下的lib/pkgconf中的。這樣只會在當前命令窗口有效,當然,你也可以修改home文件夾下的.bashrc文件(帶.的文件為隱藏文件,可以用命令vi .bashrc編輯),在文件末尾加上上面那句命令,重新登錄即可。其他的幾個在linux下也是不可或缺的,libtool為管理library時使用,沒裝的話錯誤提示如下:possibly undefined macro:AC_PROG_LIBTOOL。而autoconf和automake可以用於在某些沒有configure的文件的源碼包安裝時使用(pixman就是個典型的例子,安裝了二者後直接./autogen.sh就可以安裝了)。
准備工作做好後,就可以安裝了,具體全部命令如下:
tar vxf libX11-6.2.1.tar.gz
cd libX11-6.2.1
mkdir X11-build
cd X11-build
../configure –prefix=/usr/local/X11R6
make
echo $
sudo make install
這裡有一些好的安裝習慣可以積累一下:1、建立一個臨時編譯目錄,本例中為X11-build,這樣可以再安裝完成後刪除該目錄,進而可以節省空間,而且保持了源碼目錄的整潔;2、安裝到指定目錄,本例中為/usr/local/X11R6,最好把幾個相關的安裝在同一文件夾下,如這裡的X11R6文件夾,這樣便於管理,否則全部默認安裝在/usr/local下,很雜亂;3、編譯完成後做檢查,本例為echo $,表示檢查上一條命令的退出狀態,程序正常退出返回0,錯誤退出返回非0,也可以使用make check,主要為了防止make失敗後直接install,進而出現了一些莫名其妙的錯誤。這裡還介紹一種更方便快捷的安裝方法,用&&將安裝命令連接起來,如../configure –prefix=**&&make&&sudo make install,這樣,只有在前面的命令執行正確的情況下,後面的任務才會執行,多方便!
除此之外,安裝之前可以閱讀下源碼包中的readme和install等文檔,往往有所需軟件及其下載地址,還包括一些安裝技巧和配置選項。另外,在configure前,先輸入configure –help,可以查看有哪些選項可以添加。還有幾個關系安裝成功的東西就是ldconfig了,在安裝時如果提示找不到某個庫或者在編譯時提示找不到**.so文件,就要用到它了,最簡單的解決辦法就是sudo gedit /etc/ld.so.conf,在文件中加入**.so文件所在路徑,再運行一下ldconfig就可以了,但是我對這個東西有陰影,不知道是因為用了虛擬機還是其他的原因,有7、8次我在運行完ldconfig後,Ubuntu就沒辦法打開任何窗口了,直接關機重啟就更是進不去系統了,崩潰之,不知道有沒有高手有解決辦法。在這裡提供一種代替ldconfig的辦法,就是export LD_LIBRARY_PATH=*.so文件地址:$LD_LIBRARY_PATH,用它我就舒心多了,也就是麻煩點,哥忍了,總比系統崩潰強多了吧,呵呵!其實,在configure時碰到問題,你應該慶幸,因為你可以根據它很明顯的提示找到缺失的東西裝上,在配置下pkgconfig和ldconfig基本上就可以搞定了,但是make的時候就沒那麼簡單了。
編譯時提示最多的就是**東西未找到了,要麼是庫文件,要麼是頭文件,庫文件用上面的ldconfig基本上就可以搞定,頭文件的話需要配置包含的路徑,和庫的類似,命令如下:
export LD_INCLUDE_PATH=/usr/local/include:$LD_INCLUDE_PATH
在這個時候最重要的就是淡定了,循著丫的error往上找,像"No such file or directory"這樣的錯誤提示肯定就在附近,找到了,include之就可以咯!