我们日常在linux上安装一个程序的时候,需要先取得该程序的源码或者二进制文件,然后通过特殊的命令进行安装,那么该软件就会根据内部的脚本来检测前驱的支持是否存在,如果符合需求,那么就会进行安装。安装完成之后,还要将该软件一些变量信息写入整体的管理机制中,以方便我们未来对该软件进行升级,删除等操作。

    这套对程序包管理的工具,我们也可以称之为程序包管理器,他的功能为:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便的实现程序包的安装,升级,卸载和查询等管理操作。

    一般意义上一个程序包管理器要实现的功能主要如下:

    1.程序包的组成清单(每个程序包都单独实现;

          1)文件清单;

          2)安装或卸载时运行的脚本;

    2.数据库

          1)程序包的名称和版本;

          2)各程序包的依赖关系;

          3)功能说明;

          4)安装生成的各文件的文件路径及校验码信息


       那么我们获取程序包的方式大概有三个:

        1.系统发行版的光盘或官方的文件服务器(或镜像站点)

            1)http://mirrors.aliyun.com

            2)http://mirrors.sohu.com

            3)http://mirrors.163.com 

        2.项目的官方站点(例如zabbix或puppet)

        3.第三方组织

            1)EPEL

            2)搜索引擎

                http://pkg.org

                http://rpmfind.net

                http://rpm.pbone.net

    

      目前我们在redhat一系上用的最多的安装方式是rpm,该安装机制已经非常完善,所以已经被拿来作为普遍的工业标准。RPM的全称为“ RedHat Package Manmager”,简称为RPM,RPM是一种以数据库记录的方式将你所需的软件安装到linux系统的一套管理机制。所以我们需要学习如何使用rpm来安装二进制文件。

    在linux上,对于程序的管理有下列操作:安装,升级,卸载,查询和校验以及数据维护。

1.安装

   格式:rpm  {-i| install}[install-option] PACKAGE_FILE.

   具体选项:

    -v:verbose 详细信息

    -vv:更详细的输出

    -h:hash marks 输出进度条;每个#表示2%进度条

    --test:测试安装,检查并报告依赖关系及冲突消息等

    --nodeps 忽略依赖关系,一般不建议这么做,不可预料

    --replacepkgs  重新安装

    --nosignature  不检查签名

    --nodigest:不检查包完整性信息

示例:

[root@localhost tmp]# rpm -ivh zsh-5.0.2-7.el7_1.2.x86_64.rpm 

警告:zsh-5.0.2-7.el7_1.2.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY

准备中...                          ################################# [100%]

正在升级/安装...

   1:zsh-5.0.2-7.el7_1.2           ################################# [100%]


2.升级

    格式:

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

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

    选项:

    -U:升级或安装:

    -F:升级,不支持安装

    --oldpackage:降级

    --force:强制升级;

    

示例:rpm -Uvh PACKAGE_FILE; rpm -Fvh PACKAGE_FILE

注意点:

    1)由于linux的内核支持多版本并存,所以不要对linux内核进行升级,以免重启无法不兼容无法开机;建议直接安装新版本的内核;

    2)如果原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;


3.卸载

    格式:

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

    选项:

        --allmatches: 卸载所有匹配指定名称的程序包的各版本

        --nodeps: 忽略依赖关系

        --test:测试卸载,干跑模式

卸载时给出包名即可,通过数据库会自动寻找。

示例:

    [root@localhost tmp]# rpm -e zsh


4.查询,用的相对较多的模式

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

    有两类选项

     select-options:

    1) PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;

    2)-a, --all:查询所有已经安装过的包;

    3)-f  FILE:查询指定的文件由哪个程序包安装生成;要跟路径;

    4)-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;

    5)--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;

    6)--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;


解析如下:

     PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本; 

示例:

wKioL1Z6iaWA_7-mAAAIjYaHMHE071.png查找该程序未安装

安装后继续查询:

wKiom1Z6ifqDjdcdAAAGMqS2rXk327.png程序已安装,版本号已经显示;    


 -a, --all:查询所有已经安装过的包;

wKiom1Z6ivWxjw4eAAAH7C2pcyw193.png


-f  FILE:查询指定的文件由哪个程序包安装生成;要跟路径;

wKioL1Z6i5mx7gP3AAAIK2IhulI441.png


--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;

示例:查看zsh的能力由哪个程序包提供

wKioL1Z6kcmAg4moAAAHkqpAFjk585.png


--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

示例:查看bash被哪些包所依赖

wKiom1Z6kimhCmQFAAAWNsoxBXc490.png

-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;用法较多

-qi  PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE

-qpi  PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE

示例:查询未安装的zsh安装后生成的文件列表

wKioL1Z6k9DzknUyAAAdNJ9Ye1M627.png







[query-options]查询选项,此选项要跟 select-options配合使用;

   --scripts:查看程序包自带的脚本片断;

    -l, --list:程序安装生成的所有文件列表;

    -i, --info:程序包相关的信息,版本号、大小、所属的包组等;

    -c, --configfiles:查询指定的程序包提供的配置文件;

    -d, --docfiles:查询指定的程序包提供的文档;

    --provides:列出指定的程序包提供的所有的CAPABILITY;

    -R, --requires:查询指定的程序包的依赖关系;

    --scripts:查看程序包自带的脚本片断;



  -q --scripts:查看程序包自带的脚本片断;

示例:

wKioL1Z6jaSz011FAAAgIaMWReM931.png


 -l, --list:程序安装生成的所有文件列表;

示例:

wKioL1Z6jlegH7I6AAAJ_QtLmJc863.png


-i, --info,程序包相关的信息,版本号、大小、所属的包组等,看程序包是做什么用的

示例:

wKiom1Z6js-gL3S5AAAiek950e4020.png



-c, --configfiles:查询指定的程序包提供的配置文件;

示例.查询zsh的配置文件

wKiom1Z6j53QLNz-AAAJl_z32Do179.png


-d, --docfiles:查询指定的程序包提供的文档;

示例:查询zsh的文档

wKiom1Z6j-yA5smOAAATlh4HWcw163.png


--provides:列出指定的程序包提供的所有的CAPABILITY;

示例:查询bash提供的能力

wKiom1Z6kIfT-exNAAALSJ43G4I873.png



-R, --requires:查询指定的程序包的依赖关系;

示例:查看bash程序包的依赖关系,依赖于哪些资源

wKiom1Z6kPLixA_rAAALPxXXYxM802.png


 --scripts:查看程序包自带的脚本片断

示例:bash自带的程序脚本

wKioL1Z6ktORAegbAAAVwHCdBuA514.png



5.校验

用法:rpm {-V|--verify} [select-options] [verify-options]

示例:对zsh进行校验

wKioL1Z6lQ7TyQqDAAAfhSnM-I8002.png

校验之后未有输出,说明校验通过。


但是当我们对zsh的某个文件进行修改后,再用rpm -V进行校验,就会有特殊输出;

wKiom1Z6ld3T1dTnAAAMa1O3ngg885.png


那么执行校验时,给出的校验的意义是什么,见下:

S file Size differs  文件大小发生改变

M Mode differs (includes permissions and file type)  权限发生改变

5 digest (formerly MD5 sum) differs    MD5改变

D Device major/minor number mismatch   主次设备号不匹配

L readLink(2) path mismatch                

U User ownership differs    属主改变

G Group ownership differs   属组改变

T mTime differs              时间戳改变

P caPabilities differ        开发能力改变


那么如何对包的来源的合法性和完整进行验证呢?

原理如下:

  • 首先验证合法性:包的制作者首先用单向加密算法去计算这个程序包的特征码,提取出来,定长输出,在用自己的私钥去加密这个特征码,作为自己的签名;然后附加在包后面;使用者将制作的公钥下载下来之后,用公钥去解密这个特征码, 解密出来,即验证来源合法;

  • 验证完整性:使用者用同样的加密算法对这个包去计算,计算出一个特征码。此特征码跟制作者的特征码两者比较,两者一样,那就完整性得到校验了。


获取并导入信任的包制作者的密钥:

    对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7


如何验证?

    (1) 安装某组织签名的程序时,会自动执行验正;

    (2) 手动验正:rpm -K PACKAGE_FILE。



6.数据库的重建

    rpm查询及卸载,安装升级及校验都是从rpm数据库中获取得到信息,所以数据库的完整至关重要。

    rpm的数据库位置:/var/lib/rpm/

重建用法:

    rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]

    --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;

              如果事先不存在数据,则新建之;否则,不执行任何操作。

    --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;

                无论当前存在与否,直接重新创建数据库。

示例:在tmp下临时创建一个rpm数据库

wKioL1Z6n8bSuYeXAAAJThKpYkQ401.png

wKioL1Z6n8bCIo0nAAAhNFTQDs8162.png



     上面都是基于rpm对程序包的管理,但是包跟包之间有依赖关系,如果之间的依赖关系过于复杂,我们用rpm去安装程序的时候,手动安装解决依赖关系,就会跟我们的安装造成很大的麻烦。这种情景下,我们可以采用自动解决依赖关系的工具,这样的前端管理工具对于centos来说,yum的使用学习就非常必要了。

     yum是一种cs架构的服务器。有yum仓库及yum客户端。yum的全称为yellow dog, Yellowdog Update Modifier。yum客户端先去yum的server端去下载元数据,用来分析需要安装包的依赖关系等等,然后跟自己本地安装好的程序包做对比,然后将这些数据缓存到本地,需要安装的程序包则需要通过下载去仓库下载。以后每次安装都要先检查自己本机缓存的元数据,如果元数据已有,则不下载程序包;同时为了保证自己的缓存的元数据是新的,每次去下载新的程序时,都要拿自己缓存的元数据的校验码去跟yum仓库的元数据的校验码比对,比对成功即为最新,不成功就要重新更新元数据缓存,以保证下载的数据为最新。

     其中yum repository:存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata);

     它本身就可以看做是一个文件服务器:类似于这些格式      

             ftp://

     http://

     nfs://

     file:///

     yum客户端本身需要配置文件。有两部分组成;

     /etc/yum.conf:为所有仓库提供公共配置,比如缓存

     /etc/yum.repos.d/*.repo:为仓库的指向提供配置,特有配置

   

    其中仓库指向可以通过编辑 /etc/yum.repos.d/*.repo文件

    [repositoryID]

name=Some name for this repository   名字,完整描述

baseurl=url://path/to/repository/    等号左右不要空格,可以指定多个

enabled={1|0}   是否启用此仓库,默认是1,启用

gpgcheck={1|0} 对此仓库的合法性及完成性校验

gpgkey=URL      gpg的秘钥文件,对方仓库提供,URL能访问到秘要的访问文件

enablegroups={1|0}  是否支持基于组进行批量包管理

failovermethod={roundrobin|priority}  故障转移方法 随机|优先级

默认为:roundrobin,意为随机挑选;

cost=   开销 默认为1000


示例:vim CentOS-local.repo

[base]

        name=Base Repo on 172.16.0.1

baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-x86_64/

        gpgcheck=0


[epel]

        name=Fedora EPEL for  EPEL x86_64

        baseurl=http://172.16.0.1/fedora-epel/6/x86_64/

        gpgcheck=0

 配置完之后就可以使用yum 仓库。


yum的用法:

  1. 显示仓库列表:

    1. 格式:repolist [all|enabled|disabled]

      1. yum epolist  all 显示所有的仓库

      2. yum epolist disabled 显示禁用的仓库

      3. um epolist enabled 显示启用的仓库

    2. 示例:


[root@mageedu yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
base                                                                                                                   | 4.0 kB     00:00     
epel                                                                                                                   | 4.3 kB     00:00     
epel/primary_db                                                                                                        | 5.7 MB     00:00     
repo id                                                   repo name                                                                     status
base                                                      CentOS 6.7 on 172.16.0.1                                                       6,575
epel                                                      Fedora EPEL for EPEL x86_64                                                   11,768
repolist: 18,343


2.显示程序包:

    list

        # yum list [all | glob_exp1] [glob_exp2] [...]

        # yum list {available|installed|updates} [glob_exp1] [...]

        1)可以显示所有的包,可以跟通配符显示的,示例:  

[root@mageedu yum.repos.d]# yum list php*
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Available Packages
php.x86_64                                                                        5.3.3-40.el6_6                                          base
php-Analog.noarch                                                                 1.0.0-3.git9ab4c9e.el6                                  epel
php-Assetic.noarch                                                                1.1.2-1.el6                                             epel

    2)yum list available仓库中由但未安装的包

[root@mageedu yum.repos.d]# yum list available |grep htop
htop.x86_64                                  1.0.1-2.el6                    epel
php-lightopenid.noarch                       0.6-1.el6                      epel

    3)yum list updates 可升级的包

    4)yum list installed 已安装的包

3.安装程序包:

    1)格式:install package1 [package2] [...]

    示例:安装htop的包

[root@mageedu yum.repos.d]# yum install htop
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Install Process
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package htop.x86_64 0:1.0.1-2.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================================
 Package                        Arch                             Version                                 Repository                      Size
==============================================================================================================================================
Installing:
 htop                           x86_64                           1.0.1-2.el6                             epel                            75 k

Transaction Summary
==============================================================================================================================================
Install       1 Package(s)

Total download size: 75 k
Installed size: 161 k
Is this ok [y/N]:

后面也可跟上包的版本,默认为最新版本。

2)reinstall package1 [package2] [...]  (重新安装)


4.升降级程序包

    格式:yum update [package1] [package2] [...]

          yum downgrade package1 [package2] [...] (降级)


5.检查升级包

    格式:yum check-update


6.卸载程序包:

    格式:yum remove | erase package1 [package2] [...]

注意:卸载时,会将其依赖的包一同卸载。

[root@mageedu yum.repos.d]# yum remove cpp
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package cpp.x86_64 0:4.4.7-16.el6 will be erased
--> Processing Dependency: cpp = 4.4.7-16.el6 for package: gcc-4.4.7-16.el6.x86_64
--> Running transaction check
---> Package gcc.x86_64 0:4.4.7-16.el6 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================================
 Package                       Arch                             Version                                 Repository                       Size
==============================================================================================================================================
Removing:
 cpp                           x86_64                           4.4.7-16.el6                            @base                           9.5 M
Removing for dependencies:
 gcc                           x86_64                           4.4.7-16.el6                            @base                            19 M

Transaction Summary
==============================================================================================================================================
Remove        2 Package(s)

Installed size: 28 M
Is this ok [y/N]:


7.查看程序包的信息

    格式:yum info [...]

    示例:

[root@mageedu yum.repos.d]# yum info htop
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Available Packages
Name        : htop
Arch        : x86_64
Version     : 1.0.1
Release     : 2.el6
Size        : 75 k
Repo        : epel
Summary     : Interactive process viewer
URL         : http://htop.sourceforge.net/
License     : GPL+
Description : htop is an interactive text-mode process viewer for Linux, similar to
            : top(1).



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

    格式:yum provides | whatprovides feature1 [feature2] [...]

    示例:

[root@mageedu yum.repos.d]# yum provides htop
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
htop-1.0.1-2.el6.x86_64 : Interactive process viewer
Repo        : epel
Matched from:

    #查看/bin/ls

[root@mageedu yum.repos.d]# yum whatprovides /bin/ls
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
coreutils-8.4-37.el6.x86_64 : A set of basic GNU tools commonly used in shell scripts
Repo        : base
Matched from:
Filename    : /bin/ls



coreutils-8.4-37.el6.x86_64 : A set of basic GNU tools commonly used in shell scripts
Repo        : installed
Matched from:
Other       : Provides-match: /bin/ls


9.清理本地缓存:

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


10.构建缓存

    格式:yum makecache


11.搜索:search,以指定的关键字搜索程序包名及summary信息;

    格式:search string1 [string2] [...]

    示例:搜索包含bash的信息的包,模糊搜索

[root@mageedu yum.repos.d]# yum search bash
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
============================================================= N/S Matched: bash ==============================================================
bash-argsparse.noarch : An high level argument parsing library for bash
bash-completion.noarch : Programmable completion for Bash
bash-doc.x86_64 : Documentation files for bash
bashdb.noarch : BASH debugger, the BASH symbolic debugger
easybashgui.noarch : Bash function library
emacs-bashdb.noarch : Bashdb support for Emacs
emacs-bashdb-el.noarch : Elisp source files for Bashdb support for Emacs
gromacs-bash.noarch : GROMACS bash completion
bash.x86_64 : The GNU Bourne Again shell
bats.noarch : Bash Automated Testing System
bti.x86_64 : Bash Twitter Idiocy
erlang-basho_stats.x86_64 : Basic Erlang statistics library
python-argcomplete.noarch : Bash tab completion for argparse
sys_basher.x86_64 : A multithreaded hardware exerciser

  Name and summary matches only, use "search all" for everything.

    

12.查看指定包所依赖的capabilities:

    格式:yum deplist package1 [package2] [...]

    示例:查看htop的依赖的包  

[root@mageedu yum.repos.d]# yum deplist htop
Loaded plugins: fastestmirror, refresh-packagekit, security
Finding dependencies: 
Loading mirror speeds from cached hostfile
package: htop.x86_64 1.0.1-2.el6
  dependency: libc.so.6(GLIBC_2.4)(64bit)
   provider: glibc.x86_64 2.12-1.166.el6
  dependency: libtinfo.so.5()(64bit)
   provider: ncurses-libs.x86_64 5.7-4.20090207.el6
  dependency: rtld(GNU_HASH)
   provider: glibc.x86_64 2.12-1.166.el6
   provider: glibc.i686 2.12-1.166.el6
  dependency: libm.so.6()(64bit)
   provider: glibc.x86_64 2.12-1.166.el6
  dependency: libncursesw.so.5()(64bit)
   provider: ncurses-libs.x86_64 5.7-4.20090207.el6
  dependency: libm.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc.x86_64 2.12-1.166.el6


13.查看yum事务历史:过去发生了什么事,查询不是事物,安装升级卸载才为事物。

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

    示例:  

[root@mageedu yum.repos.d]# yum history
Loaded plugins: fastestmirror, refresh-packagekit, security
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
     3 | root <root>              | 2015-12-23 11:08 | Install        |    1   
     2 | root <root>              | 2015-12-22 00:24 | Install        |    5   
     1 | System <unset>           | 2015-12-06 12:43 | Install        |  997

    示例:显示yum事物的统计数据    

[root@mageedu yum.repos.d]# yum history stats
Loaded plugins: fastestmirror, refresh-packagekit, security
File        : //var/lib/yum/history/history-2015-12-06.sqlite
Size        : 1,224,704
Transactions: 3
Begin time  : Sun Dec  6 12:43:25 2015
End time    : Wed Dec 23 11:08:45 2015
Counts      :
  NEVRAC :  1,003
  NEVRA  :  1,003
  NA     :  1,003
  NEVR   :  1,003
  rpm DB :  1,003
  yum DB :  1,003
history stats


14.安装及升级本地程序包:

    可以用来安装自己从互联网或者其他地方获取的rpm包,同时用仓库解决其中的依赖关系。

    yum localinstall rpmfile1 [rpmfile2] [...](install也可)

    yum localupdate rpmfile1 [rpmfile2] [...](update也可)


15.包组管理的相关命令:

    * groupinstall group1 [group2] [...]

    * groupupdate group1 [group2] [...]

    * grouplist [hidden] [groupwildcard] [...]

    * groupremove group1 [group2] [...]

    * groupinfo group1 [...]

    示例:  

[root@mageedu yum.repos.d]# yum groupinstall "Development Tools"
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Group Process
Loading mirror speeds from cached hostfile
base/group_gz                                                                                                          | 219 kB     00:00     
epel/group_gz                                                                                                          | 149 kB     00:00     
Package gcc-4.4.7-16.el6.x86_64 already installed and latest version
Package 1:make-3.81-20.el6.x86_64 already installed and latest version
Package patch-2.6-6.el6.x86_64 already installed and latest version
Package 1:pkgconfig-0.23-9.1.el6.x86_64 already installed and latest version
Package gettext-0.17-18.el6.x86_64 already installed and latest version
Package binutils-2.20.51.0.2-5.43.el6.x86_64 already installed and latest version
Package elfutils-0.161-3.el6.x86_64 already installed and latest version
Package cvs-1.11.23-16.el6.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package autoconf.noarch 0:2.63-5.1.el6 will be installed
---> Package automake.noarch 0:1.11.1-4.el6 will be installed
---> Package bison.x86_64 0:2.4.1-5.el6 will be installed


16.如何使用光盘当作本地yum仓库:

    1) 挂载光盘至某目录,例如/media/cdrom

        # mount -r -t iso9660 /dev/cdrom /media/cdrom

    (2) 创建配置文件


17.yum的命令行选项:    

    --nogpgcheck:禁止进行gpg check;

    -y: 自动回答为“yes”;

    -q:静默模式;

    --disablerepo=repoidglob:临时禁用此处指定的repo;

    --enablerepo=repoidglob:临时启用此处指定的repo;

    --noplugins:禁用所有插件;


18.yum的repo配置文件中可用的变量:

    $releasever: 当前OS的发行版的主版本号;

    $arch: 平台;

    $basearch:基础平台;

    $YUM0-$YUM9


19.创建yum仓库:

    createrepo [options] <directory>



二.程序包编译安装

    1.一个程序在linux安装的过程大概如下:

    源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行

    对于C或者C++代码的编译顺序为:make (configure --> Makefile.in --> makefile)

    C代码编译安装三步骤:使用make项目管理器

        1)./configure:

    通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;

  •    检查依赖到的外部环境; 

2)make

    根据makefile文件,构建应用程序;

3)make install       

  make不是编译器,而是调用gcc来完成编译的,所以他是一个项目管理工具,他是依赖于makefile来完成项目构建。这个过程依赖于makefile,makefile不能写死,所以这时依赖一个脚本,结合事先程序员写好的模板,让用户自己指定选项后执行生成。


2.编译C源代码的前提:提供开发工具及开发环境

    开发工具:make, gcc等

    开发环境:开发库,头文件

日常工作中我们可以通过“包组”提供开发组件;

    CentOS 6: "Development Tools", "Server Platform Development",


3.具体的安装过程

1)第一步:configure脚本

    选项:指定安装位置、指定启用的特性

    安装路径设定:

    --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/ 

    配置文件安装位置;

    --sysconfdir=/PATH/TO/SOMEWHERE

    

    System types:交叉编译的时候使用

    Optional Features: 可选特性

        --disable-FEATURE

        --enable-FEATURE[=ARG]


    Optional Packages: 可选包

        --with-PACKAGE[=ARG]

        --without-PACKAGE

2)第二步:make

3)第三步:make install

4)安装后的配置:

    1.导出二进制程序目录至PATH环境变量中;

        编辑文件/etc/profile.d/NAME.sh

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


    2.导出库文件路径

        编辑/etc/ld.so.conf.d/NAME.conf

        添加新的库文件所在目录至此文件中;

        

        让系统重新生成缓存:

            ldconfig [-v]


    3.导出头文件

        基于链接的方式实现:ln -sv 

    4.导出帮助手册

        编辑/etc/man.config文件

        添加一个MANPATH

至此,一个程序编译安装完成。