一、簡介
Linux系統上程序包安裝的方式多種多樣,一般來說可通過rpm包安裝、yum在線安裝等方式實現。但有時候為了實現某種功能,而這種功能在通常情況下又不是太常用或是因為其他原因,不能通過yum下載安裝或在網上沒有找到rpm包,只是找到了程序安裝包的源代碼的話,這種情況下我們就可以對源代碼直接進行編譯安裝,以便解決這種臨時需求。當然這只是其中一種情況,而因為其他原因而采用源代碼編譯安裝的情況也經常存在,所以有必要梳理下采用源代碼安裝程序包的安裝方式。
手動編譯源代碼文件通常需要依賴相關的庫環境、編譯開發工具等,不同語言編寫的源代碼它們所依賴的頭文件、本地庫、編譯工具和被依賴的程序包的開發組件等各不相同。
二、用法詳解
一般來說帶“devel”關鍵字的rpm包都是這個程序包的開發組件。
包組(此處列出包組僅適用于centos6,其他版本名稱各有不同):
Development tools(含編譯器、匯編器、鏈接器等工具,必須)
Server Platform Development(服務器平臺開發組件,必須)
Desktop Platform Development(桌面平臺開發組件,非必須,視情況安裝)
Debug Tools(非必須,視情況安裝)
被依賴的程序包的開發組件:兩種方式:
(1) 編譯安裝被依賴的程序;
(2) 安裝相關程序的名稱中包含devel的子包;
例:安裝開發工具組件,命令為:yum groupinstall "開發工具" ,詳情見下圖:
例:安裝服務器平臺開發組件,命令為:yum groupinstall "服務器平臺開發" ,詳情見下圖:
安裝好開發套件之后就可以進行相關配置操作。
GNU make:配置文件:makefile
注意:
(1)每個項目的程序員開發完成某版本之后,會使用autoconf為程序代碼生成一個腳本文件:configure;
功用:此腳本會收集當前系統上的開發環境中所依賴各組件的版本、特性等,并檢查所依賴的環境是否能滿足,最后會根據Makefile.in 文件生成一個makefile文件;
(2)每個項目的程序員開發完成某版本之后,會使用automake為程序代碼生成一個makefile模板文件,即Makefile.in。
編譯人員的編譯安裝過程:
(1) 運行configure腳本;常使用選項指明:
安裝路徑: –prefix=/usr/local/nginx (該路徑如不存在會自動創建)
啟用或禁用的特性;
依賴的程序包;
(2) 運行make命令,完成項目構建;
(3) 運行make install命令,完成安裝(大多數情況只有管理員有權限執行此命令);
注意:前兩步只需要普通用戶權限,建議使用普通用戶身份進行;最后一步根據安裝路徑的指定,可能會用到管理權限。
configure腳本的應用:
–help: 查看幫助信息;
–prefix: 指定默認安裝路徑;
–sysconfdir: 指定配置文件安裝路徑
–with-CAPABILITY(依賴某特性)
–without-CAPABILITY(不依賴某特性)
–enable-FEATURE(啟用某特性)
–disable-FEATURE(禁用某特性)
例:安裝nginx-1.6.2.tar.gz源代碼安裝包,詳情見下圖:
例:安裝源代碼格式的httpd程序包 ,詳情見下圖:
程序運行環境:
二進制文件:$PATH環境變量指明的路徑下,/bin, /sbin, /usr/bin, /usr/sbin,/usr/local/bin,/usr/local/sbin
自己編譯的程序文件安裝路徑如果不在PATH環境變量指定的程序搜索路徑中:
(1) 使用絕對路徑;
(2) 編譯PATH環境變量,加入此些程序文件所在目錄;
export PATH=extra_path:$PATH
把上面的命令保存于/etc/profile.d/*.sh文件中
庫文件:
默認情況下,大多數應用程序都依賴于標準庫某些共享庫文件,甚至于某些應用提供的特定的庫文件;
Linux系統會在特定路徑下為應用查找所依賴的庫文件:/lib64, /lib, /usr/lib64, /usr/lib
自己編譯安裝的程序提供的庫文件有可能不在系統搜索路徑中,解決辦法:兩步驟:
(1) 編輯/etc/ld.so.conf.d/*.conf文件,添加新庫文件搜索路徑至此文件中,每行一個;
(2) 執行ldconfig命令,重新生成庫映射緩存ld.so.conf
ldconfig命令:configure dynamic linker run-time bindings
用于生成/etc/ld.so.cache
常用選項:
-p: 打印當前系統ld.so.cache中已經緩存的所有庫文件目錄及庫文件映射列表;
-v: 顯示命令執行過程的詳細信息;
頭文件導出方案:
方法:
(1) 復制所有新生成的頭文件至/usr/include目錄中(不推薦);
(2) 創建鏈接
ln -sv /usr/local/apache/include /usr/include/httpd
ln -sv /usr/local/apache/include/* /usr/include/
man手冊文件:
Linux會到特定目錄下查找用戶需要使用命令手冊
路徑:/etc/man.config配置文件中,使用MANPATH指令指向的路徑;
方法:
(1) 在此文件新增MANPATH指令,并指向新的命令手冊路徑;
(2) 在man命令執行時使用-M選項顯式指定手冊而查找路徑即可;
注意:如果安裝的程序是一個服務類程序,rpm安裝的方式通常為自動生成服務腳本文件(此文件為rpm制作者所提供),但編譯安裝不會有;需要卸載時只需刪除安裝目錄即可。
注意:編譯安裝的程序包,盡可能把所有文件安裝至一個專用路徑下,卸載時刪除此目錄即可;
其它程序語言(如:perl, python, ruby, java)開發的源碼包,編譯安裝方式可能會有所不同;
這種情況一般查看INSTALL, README文件里的使用說明即可。
原創文章,作者:鏡花水月,如若轉載,請注明出處:http://www.www58058.com/8433
寫的這么用心
@艾賀:謝謝,希望在自己記錄博客的同時,能幫助到大家 。