linux編譯軟件主要有三個(gè)步驟:./configure勇垛、make和make install 命令
編譯步驟
./configure
- ./configure 是用來檢測你的安裝平臺(tái)的目標(biāo)特征的媒抠。比如它會(huì)檢測你是不是有CC或GCC,并不是需要CC或GCC,它是個(gè)shell腳本。這一步一般用來生成 Makefile,為下一步的編譯做準(zhǔn)備。
- 可以通過在 configure 后加上參數(shù)來對安裝進(jìn)行控制败玉,比如代碼:./configure --prefix=/usr 意思是將該軟件安裝在 /usr 下面,執(zhí)行文件就會(huì)安裝在 /usr/bin (而不是默認(rèn)的 /usr/local/bin),資源文件就會(huì)安裝在 /usr/share(而不是默認(rèn)的/usr/local/share)镜硕。
- 通過 ./configure --help 來查看詳細(xì)的說明运翼。
make
- make是用來編譯的,它從Makefile中讀取指令兴枯,然后編譯血淌。大多數(shù)的源代碼包都經(jīng)過這一步進(jìn)行編譯(當(dāng)然有些perl或python編寫的軟件需要調(diào)用perl或python來進(jìn)行編譯)。
- 可能遇到的錯(cuò)誤:make *** 沒有指明目標(biāo)并且找不到 makefile财剖。 停止悠夯。說明沒有Makefile,要先./configure 一下躺坟,再make沦补。
make install
- make install是用來安裝的(當(dāng)然有些軟件需要先運(yùn)行 make check 或 make test 來進(jìn)行一些測試,它也從Makefile中讀取指令咪橙,安裝到指定的位置夕膀。這條命令來進(jìn)行安裝),這一步有 root 權(quán)限(因?yàn)橐蛳到y(tǒng)寫入文件)美侦。
- 最后運(yùn)行make clean可以刪除一些編譯產(chǎn)生的臨時(shí)文件产舞。
其他文件
/etc/ld.so.conf
- /etc/ld.so.conf 文件記錄了編譯時(shí)使用的動(dòng)態(tài)庫的路徑,也就是加載so庫的路徑菠剩。默認(rèn)情況下易猫,編譯器只會(huì)使用/lib和/usr/lib這兩個(gè)目錄下的庫文件,而通常通過源碼包進(jìn)行安裝時(shí)具壮,如果不
指定--prefix准颓,會(huì)將庫安裝在/usr/local目錄下,而又沒有在文件/etc/ld.so.conf中添加/usr/local/lib這個(gè)目錄棺妓。這樣雖然安裝了源碼包瞬场,但是使用時(shí)仍然找不到相關(guān)的.so庫,就會(huì)報(bào)錯(cuò)涧郊。也就是說系統(tǒng)不知道安裝了源碼包。 - 對于此種情況有2種解決辦法:
(1)在用源碼安裝時(shí)眼五,用--prefix指定安裝路徑為/usr/lib妆艘。這樣的話也就不用配置PKG_CONFIG_PATH
(2) 直接將路徑/usr/local/lib路徑加入到文件/etc/ld.so.conf文件的中彤灶。在文件/etc/ld.so.conf中末尾直接添加:/usr/local/lib(這個(gè)方法給力!)
ldconfig
- ldconfig這個(gè)程序位于/sbin下批旺,它的作用是將文件/etc/ld.so.conf列出的路徑下的庫文件緩存到/etc/ld.so.cache以供使用幌陕,因此當(dāng)安裝完一些庫文件,或者修改/etc/ld.so.conf增加了庫的新的搜索路徑汽煮,需要運(yùn)行一下ldconfig搏熄,使所有的庫文件都被緩存到文件/etc/ld.so.cache中,如果沒做暇赤,可能會(huì)找不到剛安裝的庫心例。
環(huán)境變量PKG_CONFIG_PATH:
- PKG_CONFIG_PATH這個(gè)環(huán)境變量是在安裝了pkg-config后出現(xiàn)的
其實(shí)pkg-config就是向configure程序提供系統(tǒng)信息的程序,比如軟件的版本鞋囊,庫的版本止后,庫的路徑等等。這些信息只是在編譯其間使用溜腐。你可以 ls /usr/lib/pkgconfig 下译株,會(huì)看到許多的*.pc,用文本編輯器打開,會(huì)發(fā)現(xiàn)類似下面的信息:
prefix=/usr
exec_prefix=$
libdir=$/lib
includedir=$/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: GLib
Description: C Utility Library
Version: 2.4.7
Libs: -L$ -lglib-2.0
Cflags: -I$/glib-2.0 -I$/glib-2.0/include
configure就是靠這些信息判斷你的軟件版本是否符合要求挺益。并且得到這些東東所在的位置歉糜。
所以要正確配置這個(gè)環(huán)境變量,我的配置是:
PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig
bin, lib,include的區(qū)別
- lib存放目標(biāo)庫文件望众,包括動(dòng)態(tài)連接庫加上一些通常不是直接調(diào)用的可執(zhí)行文件的存放位置匪补。
- bin存放使用者使用,并且不是系統(tǒng)自檢等所必需的可執(zhí)行文件黍檩。
- include存放C程序語言編譯使用的頭文件叉袍。