Linux軟件包管理


一、Linux操作系統組成部分:

系統調用:任何一個主機,它對底層硬件實現抽象后所得到(輸出)的接口 System call。

:在操作系統之上附加的一段可共享的可用代碼段,這一代碼段被分成多個模塊,每一個模塊就叫一個庫文件。

API:Application Programing Interface,。即遵循統一標准的可兼容的接口。若系統之間API互相兼容,則稱為POSIX(Protable OS,可移植操作系統, 而IX是使得其命名風格與UNIX,Linux像似而隨意添加的) API,可實現程序的跨系統運行。

:1、32位的操作系統對應32位的庫,64位的操作系統對應64位的庫;64位的內核和程序必須運行在64位的CPU上,而32位的內核和程序可運行在32位和64位的CPU上。

  2、庫接口需要有一個規范,使得在不同操作系統上開發的應用程序的源代碼可以能夠在不同系統之間彼此交叉編譯運行。

 

二、程序源代碼的執行步驟

  程序源代碼(本質為包含文本信息的文本字符串) --> 預處理操作(如C的宏替換,變量聲明的檢測,檢測數據是否溢出) --> 編譯(編譯后的代碼稱為目標代碼(Object Code)) --> 匯編器執行匯編操作將目標代碼轉換成機器代碼(指令) --> 鏈接(編譯完后指定程序需要使用的共享庫文件的位置)

 

編譯:

  靜態編譯:編譯時將程序需要的共享庫復制一份到程序內部,不需要外部環境即可運行,但會使得程序的體積增大。

  共享編譯:調用/lib,/lib64下的.so文件。

 

ABI:Application Binary Interface,

  因為Windows支持EXE格式的二進制文件,Linux支持ELF格式的二進制文件,所以程序轉換為二進制程序后不兼容,因為其ABI不同,而且其對應的庫文件的路徑可能不同(Windows下C://...,Linux下/lib...)

 

  解決不兼容問題方法:

  1、庫級別的虛擬化:

    Linux:WINE

    Windows:Cywin

    缺陷:此類虛擬化產品受眾較小;穩定性有待考證

  2、應用程序級別的解決方案,在不同的操作系統提供一個寫程序,調試程序,運行程序的應用程序(開發環境),在這個開發環境之上開發的程序即可實現跨平台。如Java的JVM。

 

程序開發級別:

  操作系統級開發:面對硬件開發程序;

  系統級開發:面對庫調用和系統調用開發程序,如C,C++;

  應用程序級開發:面對特定的應用程序專有的開發環境開發程序,如Java,Python,PHP,Perl,Ruby;

 

二進制應用程序的組成部分:

  •   二進制文件
  •   庫文件(供程序本身的多個二進制文件共享的功能或提供程序二次開發的用於調用的庫文件)
  •   配置文件
  •   幫助文件

  :若程序只提供二進制文件但需要二次開發,則需要把開發庫編譯成二進制輸出庫給用戶,並說明開發庫如何調用、其中的函數有哪些、調用的名稱、有哪些參數、參數種類、類型等信息等。

 

三、程序包管理器

  Debiandeb(程序包格式),dpt(包管理器)

  Redhat:使用Perl語言仿照deb格式研發了RPM格式的包,rpm(包管理器)

    rpm:Redhat Package Manager--->使用C語言重新研發了RPM:RPM is Package Manager(到今天為止成為主流)

  Gento

  ArchLinux

 

源代碼命名格式:

  name-VERSION.tar.gz(xz,gz2)

  VERSION組成:major.minor.release  主版本號.次版本號.發行版

 

rpm包命名格式:

  name-VERSION-release.ARCH.rpm

    VERSION:major.minor.release(程序包的release)

    release.ARCH:

      release(rpm包的release)

      release.os

    常見的arch硬件平台架構,iX86系列本質上沒有什么區別,只是對於X數字越大,適用於更高的性能、更新的CPU、對CPU的性能發揮的越好,彼此之間是兼容的):

      x86:i386,i486,i586,i686

      x86_64:x64,x86_64,amd64(第一個64位平台的CPU是由AMD研發的)

      powerpc:ppc

      跟平台無關:noarch(如Java,Python的平台無關性程序(只依賴於運行環境),有時候C語言也可做成平台兼容)

   例:zlib-1.2.7-13.el7.i686.rpm

 

引入一個問題:假設有一個程序testapp,它有28個功能,其中8個常用功能,20個不常用功能,那么如何進行打包呢?

  此時可通過拆包解決。

  如:

    testapp-VERSION-ARCH.rpm:主包

    testapp-devel-VERSION-ARCH.rpm:支包(子包,分包),依賴於主包

    testapp-testing-VERSION-ARCH.rpm:支包(子包,分包),依賴於主包

由上例可知,包之間存在依賴關系;而如果靠人工來管理包之間的依賴關系是非常不便的,因此引入程序包管理器的前端工具解決包之間依賴關系。

 

程序包管理器的前端工具:

  程序包管理器的前端工具,用於實現對所有或某一個倉庫中的所有程序包彼此之間的依賴關系做分析,並將它們抽取出來放入一個元數據文件中。將來使用這個倉庫安裝數據包時,它能夠自動查找對應的元數據文件,並根據元數據文件獲取到包之間的依賴關系。並且它還能到指定的倉庫中(本地或互聯網上的倉庫),扮演一個ftp服務器的客戶端工具的角色,下載的程序包緩存到本地安裝完,安裝完成后會將包清理掉(Android上的安裝軟件也是如此)。

 

  yum:rpm包管理器的前端工具;

  apt-get:deb包管理器的前端工具

  zipper:Susa上rpm包管理器的前端管理工具

  dnf:Fedora 22+ rpm包管理器的前端管理工具

  YaST:Susa圖形化管理工具(類似於控制面板)

 

查看二進制程序依賴的庫文件:

  ldd /PATH/TO/BINARY_FILE

  如:

管理及查看本機裝載的庫文件:

  ldconfig

    /sbin/ldconfig -p    #顯示本機已經緩存的所有可用庫文件名及文件路徑緩存映射關系

  一個應用程序啟動時,向系統請求某庫文件時,若此庫文件已經轉載進內存中,直接使用;若未裝載到內存中,通過ldconfig -p查看緩存來獲取庫文件的位置,再讀入到內存中。

  可以通過重讀來重新生成緩存,直接敲ldconfig重新讀取並裝載緩存:

    配置文件為:/etc/ld.so.conf、/etc/ld.so.conf.d/*.conf

    緩存文件為:/etc/ld.so.cache

 

四、程序包管理

功能:將編譯好的應用程序的各組成文件打包成一個或多個程序包文件,從而方便而快捷的實現程序包管理的安裝、卸載、查詢、升級和校驗等管理操作。

 

組成:

  1、程序的組成清單:(每個包獨有)

    文件清單

    安裝或卸載時運行的腳本

  2、數據庫:(公共)

    程序包的版本及名稱

    依賴關系

    功能說明

    安裝生成的文件路徑及校驗碼信息

 

管理程序包的方式:

  使用包管理器:rpm

  使用前端工具:yum、dnf

 

獲取程序包的途徑:

  1、系統發行版的光盤或官方的服務器

    CentOS鏡像:

      http://mirrors.aliyun.com

      http://mirrors.sohu.com

      http://mirrors.163.com

  2、項目官方站點

  3、第三方組織:

    建議優先選擇Fedora-EPEL(唯一可靠第三方來源,不加檢測即可信任)

    第三方提供者使用搜索引擎搜索即可

    搜索引擎:(專門找rpm包的搜索引擎)    

      http://pkgs.org

      http://rpmfind.net

      http://rpm.pbone.net

  4、自己制作

 

  檢查:無論從何處下載的任何程序包都需要檢查其合法性(文件在傳輸過程中都有可能被篡改(經過別人路由時))

    來源合法性;

    程序包的完整性;  

 

五、CentOS系統上rpm命令管理程序包(熟練應用)

  安裝、卸載、升級、查詢、校驗、數據庫維護

安裝:

 

  rpm {-i|--install} [install-options] PACKAGE_FILE ...
    -v:verbose,顯示安裝信息
    -vv:顯示更詳細的信息
    -h:以#顯示程序包安裝管理執行進度;每個#表示2%進度

  常用組合:

  rpm -ivh PACKGE_FILE ...

 

  [install options]

  --test     #測試安裝,但不真正執行安裝過程;dry run模式
  --nodeps  #忽略依賴關系
  --replacepkgs  #重新安裝

  --nodigest  #不檢查包完整性
  --nosignature  #不檢查程序來源的合法性
  
  --noscript  #不執行程序中的腳本片段
    %pre  #安裝前的腳本  --nopre
    %post  #安裝后的腳本  --nopost
    %preun  #卸載前的腳本  --nopreun
    %postun  #卸載后的腳本  --nopostun

 

 

升級:

  兩種升級方案: 

  rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

 

  rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

 

    upgrade:若安裝有舊版程序包,則“升級”,如果不存在舊版程序包,則安裝;

    freshen:若安裝有舊版程序包,則“升級”,如果不存在舊版程序包,則不執行任何操作;

  常用命令:

  rpm -Uvh PACKAGE_FILE ...

 

  rpm -Fvh PACKAGE_FILE ...

  [opitons]:

    參見安裝的options

 --oldpackage    #降級(用舊版的程序包替換新版的程序包)
 --force    #強制升級(可能存在不兼容的情況,使用force無論是否兼容強制升級)

 

  注意:

    1、不要對內核做升級操作(Linux3以前升級完成后必須重啟系統,升級完成后可能出現系統無法啟動的情況);Linux支持多內核版本並存,因此,直接安裝新版本內核;

    2、如果源程序包的配置文件安裝后曾被修改,升級時,新版本提供的同一個配置文件並不會覆蓋老版本的配置文件,而是把新版本的配置文件重命名為FILENAME.rpmnew后保留;(若新版本的配置文件與舊版配置文件完全一樣,新版配置文件不會安裝);

 

查詢:

 

  rpm {-q|--query} [select-options] [query-options]

 

  [select-options]:(查詢對象,即查詢什么)

  -a    #查詢當前系統上所有已安裝的程序包
  -f FILE  #查詢指定文件由哪個程序包安裝生成
  -g GROUP  #查詢指定包組的程序包

  --whatprovides CAPABLITY  #查詢指定的CAPABILITY(能力,功能)由哪個包提供
  -p,-package /PATH/TO/PACKAGE_FILE  #針對尚未安裝的程序包做查詢操作

 

  [query-options]:(查詢的內容)

  --changelog    #查詢rpm包制作changelog(修改日志)
  -d、--docfiles  #查詢程序的文檔
  -i、--info  #程序包的information
  -l  #列出指定程序包安裝完成的所有文件
  --scripts  #查看程序包自帶的腳本片段
  -R:  #查詢指定的程序包所依賴的CAPABILITY
  --provides  #列出指定程序包所提供的CAPABILITY

 

  常用組合:

  rpm -qi PACKAGE
  rpm -qf FILE
  rpm -qc PACKAGE
  rpm -ql PACKAGE
  rpm -qd PACKAGE
  rpm -qpi PACKEGE_FILE
  rpm -qpl PACKAGE_FILE
  ...

 

卸載:

  rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]
             [--notriggers] [--test] PACKAGE_NAME ...

 

校驗:

 

rpm {-V|--verify} [select-options] [verify-options]

 

  校驗結果含義:

 

包的來源合法性及完整性驗證:(包安裝之前或安裝中應該執行的操作)

  完整性驗證:SHA256

  公鑰加密(非對稱加密):RSA

 

  對稱加密:加密,解密使用同一密鑰;

  非對稱加密:密鑰是成對的;

    public key:公鑰,公開給所有人

    secret key:私鑰,不能公開

    

  制作者制作好程序包后使用單向加密算法計算包的特征碼,並將特征碼使用私鑰加密后附加在程序包中。制作者的公鑰采用可靠手段發布給所有人(依靠第三方可信機構)

 

  導入所需要的公鑰實現校驗:(GPG密鑰)

  rpm --import /PATH/FROM/GPG-PUBLIC-FILE
    -K  #直接檢驗程序包來源合法性和包完整性,不用安裝    

  如:CentOS 7發行版光盤提供的密鑰文件:RPM-GPG-KEY-CentOS-7

 

rpm數據庫在/var/lib/rpm下(存儲狀態信息(存儲程序包依賴的數據文件))

 

數據庫的重建(數據庫損壞時需要做的操作):

  rpm {--inittab|--rebuilddb}
    --inittab  #初始化,如果事先不存在數據庫,則新建之;否則,不進行任何操作;
    --rebuild  #重建,無論當前存在與否,直接重新創建數據庫;

  為保證程序包的完整性,CentOS 7不允許多個rpm命令同時執行。(包管理器支持事務類操作,每一個操作都是原子,而且每一種操作都有隔離的概念在其中)

 

六、yum的基本工作機制

  使用rpm管理程序包時可能會出現一些問題,如程序包直接的依賴,雖然在安裝時可以通過--nodeps來忽略依賴關系,但在使用時可能會出現問題。而手動解決依賴關系又是比較麻煩的一件事情。所以就需要高於rpm,dep等包管理器,能實現在前端自動解決程序包依賴關系並完成安裝的工具,解決用戶的后顧之憂。

  CentOS程序包前端工具:yum,dnf

 

  yum是一個基於C/S架構的工具,yum依賴於rpm而存在

  

 

  yum獲取程序包描述信息至本地緩存中並分析其依賴關系,需要分析本地軟件的安裝情況,查看依賴的程序哪些已安裝,哪些未安裝。之后向服務器發送下載的程序包的請求,安裝完成后自動刪除已安裝的程序包,但元數據信息不會刪除,以便下一次查詢。元數據文件可能不止一個,用於存儲包名、依賴關系等,其中有一個特殊的文件存放的是每一個文件的校驗碼信息。每一次客戶端請求服務器時,首先請求元數據的校驗碼信息與本地校驗碼進行比較,以此檢測文件是否發生改變,保證本地文件為最新版本。

  yum不可避免其被取代的命運,因為其本身的工作機制,設計體系以及用到的功能上有一定問題的,比如它的依賴關系雖然能解決,但問題是某一次執行過程當中如果半道終止時,下一次重啟將無法解決,因為無法分析上一次包安裝成功與否。dnf就是解決yum所遇到的問題的。

  

YUM:Yellow Update Modifier,有Yellow dog研發

 

yum repository:簡稱yum repo,yum倉庫

  存儲了很多rpm包,以及包相關元數據文件(放置於特定目錄下:repodata),包的元數據文件可通過createrepo工具創建。

  倉庫一般是一個文件服務器:

    可以基於ftp://提供服務

    也可以基於http://提供服務

    也可以通過nfs://提供服務

    file://(本地的,如本地安裝光盤就是一個本地倉庫)

 

七、yum客戶端:

配置文件:有兩部分組成,/etc/yum.conf中有一個包含指令,可包含其它配置文件,遵循現代將大段的配置文件分成多段的風格

  /etc/yum.conf:主配置文件)為所有yum倉庫提供公共配置

  /etc/yum.repos.d/*.repo:提供每一個yum倉庫的特有配置。用於配置一個或多個倉庫指向(一個yum可以同時指定多個不同類倉庫,在安裝某一程序包時,可同時分析所有倉庫,在所有倉庫中找一個最新的程序包安裝)

 

倉庫指向的定義:

  幫助手冊:

  man yum.conf  
  [repositoryID]  #repositoryid Must be a unique name for each repository, one word.
  name=Some name for this repository  #name A human readable string describing the repository.
  baseurl=url://path/to/repository/  #等號右邊不要出現空格,否則容易出現語法錯誤,baseurl Must be a URL to the directory where
                        #the yum repository’s ‘repodata’ directory lives. Can be an http://,ftp:// or file:// URL.
                        #You can specify multiple URLs in one baseurl statement. The best way to do this is like
  enable={1|0}  #是否啟用此倉庫(默認為1)
  gpgcheck={1|0}  #對此倉庫的程序包在安裝之前是否檢查其完整性及來源合法性
  repo_check={1|0}  #是否檢測此倉庫的元數據文件的簽名信息
  gpgchk=URL  #此URL指向GPG的密鑰文件(有可能是對方倉庫提供的,通過URL訪問文件)
  enablegroups={1|0}  #是否允許在此倉庫上基於組執行程序包管理,默認為1(支持)
  failovermethod={‘roundrobin’(輪詢,隨機)|‘priority’(優先級,自上而下)}  #故障轉移方法,baseurl指定多個URL時,當使用的URL損壞時,
                                              #需定義指定下一個URL的策略。默認為roundrobin隨機挑選
  cost=  #開銷數字,默認為1000

 

以CentOS6.5為例定義倉庫文件:

   

    yum repolist    #列出所有可用倉庫

 

    第一次使用yum repolist時yum會到到對應服務器下載數據文件(此處引用了一個不可用的位置,僅用於演示效果,並不是一個真實的repo),下載到本地后列出當前有多少個repo,每個repo的ID是什么以及當前內部有多少個程序包。

 

yum命令的用法:

 

  yum [options] [command] [package ...]

    command is one of:
    * install package1 [package2] [...]
    * update [package1] [package2] [...]
    * update-to [package1] [package2] [...]
    * check-update
    * upgrade [package1] [package2] [...]
    * upgrade-to [package1] [package2] [...]
    * distribution-synchronization [package1] [package2] [...]
    * remove | erase package1 [package2] [...]
    * list [...]
    * info [...]
    * provides | whatprovides feature1 [feature2] [...]
    * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    * makecache
    * groupinstall group1 [group2] [...]
    * groupupdate group1 [group2] [...]
    * grouplist [hidden] [groupwildcard] [...]
    * groupremove group1 [group2] [...]
    * groupinfo group1 [...]
    * search string1 [string2] [...]
    * shell [filename]
    * resolvedep dep1 [dep2] [...]
    * localinstall rpmfile1 [rpmfile2] [...]
    (maintained for legacy reasons only - use install)
    * localupdate rpmfile1 [rpmfile2] [...]
    (maintained for legacy reasons only - use update)
    * reinstall package1 [package2] [...]
    * downgrade package1 [package2] [...]
    * deplist package1 [package2] [...]
    * repolist [all|enabled|disabled]
    * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
    * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    * load-transaction [txfile]
    * check
    * help [command]

  顯示倉庫列表:

  yum repolist [all|enabled|disabled]    #默認為enabled,顯示啟用的

  顯示程序包: 

  yum list [all | glob_exp1] [glob_exp2] [...]  #List all available and installed packages.
  yum list {available|installed|updates} [glob_exp1] [...]   # List all packages in the yum repositories available to be installed.
                          #available表示倉庫中有但尚未安裝的程序包,installed表示已安裝的程序包,updates表示可用來升級的程序包

  安裝程序包:

  yum install package1 [package2] [...]
  yum reinstall package1 [package2] [...]    #重新安裝

  升級程序包:

  yum update package1 [package2] [...]
  yum downgrade package1 [package2] [...]  #降級

  檢查可用升級:(有哪些升級包可用)

  yum check-update

  卸載程序包:

  yum remove | erase package1 [package2] [...]

  查看程序包information:(程序包的簡要信息)

  yum info [...]

  查看指定的特性(可以是某文件)是由哪個程序包提供:

  yum provides | whatprovides feature1 [feature2] [...]

  清理本地緩存:

  yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

  構建緩存:

  yum makecache

  搜索:(模糊匹配)

  yum search string1 [string2] [...]  #以指定關鍵字搜索程序包名及summary信息

  查看指定包所依賴的CAPABILITIES:

  yum deplist package1 [package2] [...]

 

  安裝、升級、卸載、修改會啟動yum事務

 

  查看yum事務歷史:

  yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

  安裝並升級本地程序包:

  yum localinstall rpmfile1 [rpmfile2] [...]
             (maintained for legacy reasons only - use install)
  yum localupdate rpmfile1 [rpmfile2] [...]
             (maintained for legacy reasons only - use update)

  包組管理的相關命令:

  yum groupinstall group1 [group2] [...]
  yum groupupdate group1 [group2] [...]
  yum grouplist [hidden] [groupwildcard] [...]
  yum groupremove group1 [group2] [...]
  yum groupinfo group1 [...]

 

以本地光盤當做yum源(倉庫),以CentOS 6.5為例進行演示:

(1).引入光盤

(2).掛載光盤

(3).創建配置文件

 

yum命令行選項:(命令行的優先級高於配置文件)

  --nogogcheck:禁止進行gpgcheck(即便倉庫中指定了gpgcheck,依然可以禁止掉)

  -y:自動回答為yes

  -q:靜默模式

  --disablerepo=repoidglob:臨時禁用此處指定的repo;

  --enablerepo=repoidglob:臨時啟用指定的repo;

  --noplugins:禁用所有插件;

yum的repo配置文件中可用的變量:

  $releasever:當前OS發行版的主版本號;

  $arch:平台

  $basearch:基礎平台(例如:i386,i486,i586,i686認為它們的基礎平台為i386。因此不管是i386、i486、i586、i686,只要是32位的統統可以理解為i386)

  $YUM0-$YUM9:內置的自定義變量

  例:http://mirrors.test.com/centos/6.5/x86_64/os可使用變量替換:http://mirrors.test.com/centos/$releasever/$basearch/os。

  若多個倉庫中有同一應用程序,具體使用哪一個取決於配置文件的cost

 

(4).創建yum倉庫:

  yum install createrepo    #createrepo用於幫助組織和管理創建rpm包相關的repodate目錄的文件

    createrepo ./  #在當前目錄下創建repodate目錄及文件
    createrepo [options] <directory>

 

    file:///...,#三個/,前兩個是協議符號,第三個是文件路徑

    yum repolist  #生成緩存

 

八、程序包的編譯安裝

有時候可能會出現已編譯好的rpm包無法適用的情況,原因:

1、找不到可用的rpm包,因為最新版還未制作;

2、雖然有符合需求的rpm包,但需要的功能並未編譯進去;

 

rpm包有兩種形式:已編譯好、未編譯好

如:testapp-VERSION-release.src.rpm

  源代碼未經編譯的rpm包,安裝后使用rpm包制作命令(rpmbuild)制作成二進制格式的rpm包,而后再安裝;采用這種方式的rpm包的原因:rpm制作者並不能確定使用者的平台,可能是32位,或64位,或ppc,故而臨時編譯是能編譯成適合當前CPU使用的指令,即編譯制作成完全符合自己平台需要版本的程序包的過程。

 

程序執行過程:

  源代碼 --> 預處理 --> 編譯(如gcc) --> 使用匯編器匯編 --> 鏈接器鏈接 --> 執行

 

源代碼的組織格式:

  多文件:文件中的代碼段之間,很可能存在跨文件依賴關系。因此,為降低將來對代碼管理的難度,需借助於代碼的增強性的管理工具(項目管理器),如Java的Maven;C語言同樣需要項目管理器,而不應該使用gcc直接編譯。

  C、C++項目管理工具:make(項目打包、構建、組織管理工具)

  Java:Maven

 

  make需要依賴於一個指示文件,每一個源代碼都有一個專用的配置文件。在make時依據這個配置文件做出決定,比如調用哪個預處理器如何預處理、調用哪個編譯器執行編譯、先編譯哪個配置文件后編譯哪個配置文件等,這個文件被稱為makefile。當然makefile是不應該事先存在的,它也不是對所有用戶的需求都是一樣的。因為我們做完make之后,程序包還需要安裝,那么二進制文件裝哪去呢?庫文件裝哪去呢?這些對不同的用戶需求是不一樣的,所以說如果把makefile寫死就失去了靈活性了。

  makefile文件是由Makefile.in(makefile的模板)根據用戶的需要生成的。configure腳本(允許用戶傳遞一堆選項來指明程序包的編譯參數、啟用特性、安裝路徑等等)通過Makefile.in模板生成最后的makefile文件。

 

C代碼編譯安裝三步驟:

  ./configure

    (1).通過選項傳遞參數,指定啟用特性、安裝路徑等等,執行時會參考用戶的指定以及Makefile.in文件生成makefile;

    (2).檢查依賴到的外部環境;因為程序中的某一個功能可能需要依賴其它程序,若檢測到依賴的程序包未安裝,會報錯。

  make

    make用於根據makefile文件構建應用程序;

    make是真正構建項目成為二進制程序的關鍵步驟,但make本身不是編譯器,他調用編譯器(如gcc)完成編譯。make是一個項目管理工具,他依賴於makefile文件完成項目打包、構建、編譯等操作,而makefile又不能寫死,所以需要依賴於configure腳本,結合事先程序員寫好的模板讓用戶自己指定選項后執行生成。

  make install

    將安裝后生成的二進制文件、庫文件放入指定的目錄下。

 

開發工具:

  autoconf:生成configure腳本(對於不同的應用程序,configure腳本一定是不一樣的,因為不同的程序特性不同、支持的參數也不同)

  automake:生成Makefile.in文件

 

建議:

  安裝前查看INSTALL,README。

 

開源程序源代碼的獲取:

  官方自建站點:

    apache.org(ASF)

    mariadb.org

  代碼托管:

    SourceForge

    Github.com

    code.google.com

 

C/C++開發工具:gcc(GNU C Compiler)  

 

編譯C源代碼:

  前提:提供開發工具及開發環境

    開發工具:make、gcc等

    開發環境:開發庫、頭文件等

      glibc:標准庫(提供兼容POSIX API的操作系統在C程序級別應該提供C庫)

  在CentOS 5,6,7中,開發工具和開發環境有所不同,因為安裝開發工具和開發庫的方式、程序版本、依賴的庫文件的命名機制各有不同,所以在CentOS5,6,7中通過“包組”的形式提供開發組件。(開發包組並不能容納所有的程序包,只是將那些便於定義成組的定義成了組)如:CentOS 6:“Development Tools”,“Server Platform Development”。

 

安裝程序包:

  第一步:configure腳本

  選項:指定安裝位置、指定啟用的特性

  --help:獲取其支持使用的選項

    選項分類

      安裝路徑設定:

        --prefix=/PATH/TO/SOMEFILE:指定默認位置,默認為/usr/local;

        --sysconfdir=/PATH/TO/SOMEFILE:配置文件安裝位置;

      System types:(交叉編譯時使用。交叉編譯:比如在x86_64平台編譯后可以在ppc平台運行。)

      

      Optional Features:可選特性

        --disable-FEATURE

        --enable-FEATURE[=ARG]

 

      Optional Packages:可選包

        --with-PACKAGE[=ARG]  #定義依賴關系

        --without-PACKAGE  

  第二步:make

  第三步:make install

 

安裝后的配置:

1、導出二進制程序目錄至PATH環境變量中:

  編輯文件:/etc/profile.d/NAME.sh

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

2、導出庫文件路徑

  編輯/etc/ld.so.conf/NAME.conf

    繼續添加新的庫文件所在目錄至此文件中:

      如:/usr/local/apache2/lib

    讓系統重新生成緩存:

  ldconfig [-v]

 

3、導出頭文件(創建鏈接,可以導出整個目錄,也可以導出目錄中的每一個文件)

  基於鏈接的方式實現:

  ln -sv NAME

 

4、導出幫助手冊

  編輯/etc/man.config文件

    繼續添加一個MANPAT即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM