1. 程式人生 > >在Linux上進行原始碼編譯安裝程式詳解

在Linux上進行原始碼編譯安裝程式詳解

文章轉載自:http://xuweitao.blog.51cto.com/11761672/1905357

1. 編譯安裝概述

前面兩篇關於程式包管理器的文章談到,無論是使用rpm命令還是yum命令安裝的都是已編譯好的程式包,在整個安裝過程中使用者只需執行一條命令即可完成安裝。這樣帶來的好處是方便,但因為是安裝的是已編譯好的包,所以使用者的系統平臺環境必須與rpm包製作者的系統平臺環境相同。此外,如果使用者要安裝使用某程式上的某個功能,而rpm包製作者在編譯過程中預設沒有指定該功能的實現,這時候該怎麼辦呢?更何況如果某程式只是提供原始碼而沒有現成的rpm包。這時就需要使用者手動編譯安裝了,而編譯安裝就是將程式原始碼編譯成完全適合自己平臺型別的程式包。

因此,使用者首先得獲得程式原始碼包(SRPM, Source RPM)。RPM包的命名格式為:name-VERSION-release.arch.rpm,而程式原始碼包(SRPM)的命名格式為:name-VERSION-release.src.rpm。可以發現,SRPM與RPM相比,將arch替換為src,說明SRPM包去掉了arch這一平臺型別限制,因此經過使用者自己編譯安裝可以編譯成適合自己平臺的程式包。

以下為編譯過程圖解(以C原始碼為例):
這裡寫圖片描述

我們知道,程式原始碼一般為多檔案組織格式,因此檔案中的程式碼檔案之間很有可能存在跨檔案的依賴關係,這將給使用者自行編譯安裝帶來了極大麻煩,因為對先編譯哪些檔案、後編譯哪些檔案根本無從知曉,因此這就需要專案管理器(或者專案構建器)了。C/C++的專案管理器為make,make工具可以在編譯過程中指定使用哪個前處理器進行預處理、使用哪個編譯器進行編譯以及先編譯什麼程式檔案、後編譯什麼程式檔案,甚至完成更為複雜的操作等,能幫助使用者快速地編譯安裝。make工具的執行依賴於makefile配置文件,因此make執行的所有操作皆由makefile指定。makefile可由執行configure指令碼生成。而在執行configure指令碼時,configure會結合使用者通過命令列指定的選項以及各個Makefile.in模板檔案來生成makefile檔案。編譯完成之後即可使用make install命令將編譯好的程式包複製到使用者指定的各個目錄下。

2. C程式碼編譯安裝三步驟

(1) 執行configure指令碼(# ./configure [option…])

常用選項:

--help:獲得其支援使用的選項
--prefix=/PATH/TO/SOMEWHERE:指定預設安裝位置;預設為/usr/local/;
--sysconfdir=/PATH/TO/SOMEWHERE:配置檔案安裝位置;
--enable-FEATURE[=ARG]:開啟指定特性以及安裝路徑;預設開啟時無須指定;
--disable-FEATURE:關閉指定特性;預設關閉時無須指定;
--with-PACKAGE[=ARG]:安裝指定依賴包以及其安裝路徑;
--without-
PACKAGE:不安裝指定依賴包;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

執行configure指令碼的作用:
①使用者可以通過選項傳遞引數給configure指令碼,以指定啟用的功能特性、安裝路徑等;而configure指令碼在執行的過程中會參考使用者的指定以及Makefile.in檔案生成makefile檔案;
②檢查程式指定要啟用的功能特性所依賴到的外部環境。

(2) 執行make程式

作用:
make會執行真正的編譯操作,但make本身並不是編譯器,它只是一個專案構建工具,make程式會根據執行configure指令碼所生成的makefile檔案,並呼叫所需要用到的編譯器來構建應用程式。

(3) 執行make install安裝操作

作用:
在前面的make程式執行之後,在當前目錄下會創建出已編譯完成的目標二進位制格式的應用程式(包括二進位制程式、庫檔案、配置檔案及幫助文件等),而make install則會執行安裝操作,即把當前目錄下已編譯好的程式包(二進位制程式、庫檔案、配置檔案及幫助文件等)複製到使用者指定的各個目錄下。

注意:各個程式在編譯安裝過程中可能不盡相同,因此建議安裝前檢視INSTALL, README。

3. 編譯安裝後的配置

(1) 匯出目標二進位制程式目錄至PATH環境變數中

方法:
在生產環境中如果該二進位制程式作為全域性變數,可以在/etc/profile.d/目錄下建立/etc/profile.d/NAME.d檔案,其中’NAME’可定義設定名稱。在該檔案中寫入下面一行:

export PATH=$PATH:/PATH/TO/BIN
  
  • 1

這裡的/PATH/TO/BIN即為目標二進位制程式所在目錄。

(2) 匯出庫檔案路徑

方法:
①在/etc/ld.so.conf.d/目錄下建立/etc/ld/so.conf.d/NAME.conf,其中NAME為自定義設定名稱。而後,新增新的庫檔案所在目錄至此檔案中即可。
②做完這一步之後,需要讓系統重新生成快取:

ldconfig [-v]
  
  • 1

(3) 匯出標頭檔案(位於include目錄)

程式編譯安裝完成之後,一般在安裝路徑中會有include目錄,這個include目錄就是標頭檔案,標頭檔案的功能是把外部檔案的內容包含到原始檔中,例如外部函式等。在程式開始編譯之前,會執行一段預處理指令,而預處理指令則把標頭檔案的內容包含到原始檔中。
如果要匯出標頭檔案,可基於軟連結的方式來實現:

ln -sv  標頭檔案目錄  連結標頭檔案目錄
  
  • 1

(4) 匯出幫助手冊

方法:
在CentOS 6上:
編輯/etc/man.config檔案,新增一個MANPATH:

MANPATH /PATH/TO/MAN
  
  • 1

這裡’/PATH/TO/MAN’為目標程式的安裝路徑下的幫助手冊目錄。

在CentOS 7上:
編輯/etc/man_db.conf檔案,新增一個MANPATH:

MANPATH_MAP /PATH/TO/BIN            /PATH/TO/MAN
  
  • 1

這裡/PATH/TO/BIN是目標二進位制程式所在目錄,/PATH/TO/MAN則是該程式的幫助手冊所在目錄。