1、程序包的组成:

由四部分组成:二进制格式文件、库文件、配置文件、及帮助文件。


2、程序包管理器作用:

将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载、查询、校验等管理操作。


2.1、程序包的组成清单:(每个程序包都单独实现)

    文件清单

    安装或卸载时运行的脚本

2.2程序包数据库(公共):数据库路径:/var/lib/rpm

    存储程序包的名称和版本

    各程序包之间的依赖关系

    功能说明

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

    

3、项目构建工具:

用来解决哪些源文件先编译,哪些库文件先编译,源文件和库文件的依赖关系。

c、c++:程序包项目构建工具:make

java:程序包项目构建工具:maven


4、源代码程序名字格式:

    name-version.tar.gz

        version:major.minor.release  //主版本号.次版本号.发行号

4.1、rpm程序包名字格式:

    name-version-release.os.arch.rpm

        version:源代码命名格式;version:major.minor.release  //主版本号.次版本号.发行号

        release.arch:打包后的命名格式,即rpm包的发行号,arch为适用的平台。

arch平台:i386、x64/amd64、ppc、noarch(平台无关,如java)


rpm包拆包:主包和分支包

主包命名:name-version-release.arch.rpm

分支包命名:name-function-version-release.arch.rpm    //function为分支包功能说明。

如:

anaconda-21.48.22.121-1.el7.centos.x86_64.rpm  
anaconda-core-21.48.22.121-1.el7.centos.x86_64.rpm 
anaconda-dracut-21.48.22.121-1.el7.centos.x86_64.rpm


5、包依赖关系解决:

所谓包依赖就是安装a程序包时需要先安装b程序包,linux前端工具可以自动解决这种依赖关系。

centos前端工具:yum

debian前端工具:apt-get

suse前端工具:zypper


6、程序包获取途径:

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

        http://mirrors.aliyun.com/

        http://mirrors.sohu.com/

        http://mirrors.163.com/

    ②项目的官方站点

    ③第三方组织制作的rpm包

        EPEL站点

        搜索引擎:http://rpmfind.net/

             http://rpm.pbone.net/

             https://pkgs.org/

    ④自己制作rpm包

建议:检查程序包来源合法性和完整性。




7、

centos上rpm命令

  rpm格式:

   rpm [options] [package_file]

options:

    -i,--install : 安装

    -U,--upgrade:升级或安装,有没有老版本都可以,若安装则升级,若没安装则安装

    -F,--freshen:升级,仅能升级,如果没有老版本,则不升级

    -e,--erase:卸载,

    -q,--query:查询

    -V,--verify:校验

    --builddb,--initdb:数据库维护

通用options:

     -v:输出详细信息

    -vv:输出更详细信息


7.1、rpm程序包安装

 rpm {-i|--install} [install-options] PACKAGE_FILE ...

[install-options]    

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

    --test:只检测包的冲突性,但不安装,检测包依赖关系。

        如:  [root@localhost Packages]# rpm -ivh --test zziplib-utils-0.13.62-5.el7.x86_64.rpm 

            error: Failed dependencies:

        libzzip-0.so.13()(64bit) is needed by zziplib-utils-0.13.62-5.el7.x86_64

        libzzipfseeko-0.so.13()(64bit) is needed by zziplib-utils-0.13.62-5.el7.x86_64

        libzzipmmapped-0.so.13()(64bit) is needed by zziplib-utils-0.13.62-5.el7.x86_64

        zziplib(x86-64) = 0.13.62-5.el7 is needed by zziplib-utils-0.13.62-5.el7.x86_64

            [root@localhost Packages]# 

    --nodeps:忽略包依赖关系安装,但是不能保证安装后可以正常使用,不建议用此选项。

    --replacepkgs:重新安装程序包,注意:此选项不能替换配置文件       

    --noscripts:安装不执行任何脚本

        注意:rpm可以自带脚本,有四类,如下:

        preinstall:安装过程开始之前运行的脚本;%pre

        postinstall:安装过程完成之后运行的脚本;%post

        preuninstall:卸载过程真正开始执行之前运行的脚本;%preun

        postuninstall:卸载过程之后运行的脚本;%postum

    

    --nopre:不运行安装过程开始之前运行的脚本

    --nopost:不运行安装完成后运行的脚本

    --nopreun:不运行卸载过程开始之前运行的脚本

    --nopstun:不运行卸载完成之后运行的脚本

    --nosignature:不检查包签名信息,不检查来源合法性

    --nodigest:不检查包完成性


7.2、rpm程序包升级

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

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

 -U和-F的区别:

    -U:不依赖是否安装老版本,若没安装,则进行安装,若安装,则对其进行升级

    -F:依赖老版本升级,没有老版本则不升级

[install-options]

    --nodeps:忽略包依赖关系

    --test:仅测试升级,不升级

    --oldpackage:降级安装

    --force:强制升级

注意:不要对内核版本做升级(不建议直接升级);linux支持多内核版本并存,因此,直接安装新版本内核

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


7.3、rpm程序包卸载:

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

注意:rpm包安装、升级时提供的都是包文件的具体路径名(PACKAGE_FILE),查询、卸载时只需要提供包名即可(PACKAGE_NAME)。

如:

[root@localhost Packages]# rpm -ivh zsh-5.0.2-25.el7.x86_64.rpm 

Preparing...                          ################################# [100%]

package zsh-5.0.2-25.el7.x86_64 is already installed

[root@localhost Packages]# rpm -evh zsh

Preparing...                          ################################# [100%]

Cleaning up / removing...

   1:zsh-5.0.2-25.el7                 ################################# [100%]

[root@localhost Packages]# 


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

    --nodeps:忽略包之间的依赖关系

    --test:仅测试卸载,但不做真正意义上的卸载。


7.4、rpm程序包查询:

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

此处的[select-options]作用是挑选哪些包查询,[query-options]查询指定包的哪些特性

[select-options]:

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

    -a或--all:查询所有已安装的包;可以和grep PATTERN一起组合使用  

    -f FILE_PATH:查询指定的文件由哪个程序包安装生成,注意由于是指定的文件,因此要给出文件具体路径信息

        如:  [root@localhost Packages]# rpm -qf /bin/zsh

            zsh-5.0.2-25.el7.x86_64

            [root@localhost Packages]# 

    -g或--group:查询包组中安装了哪些程序包

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

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

    -p或--package:对未安装的程序包执行查询操作,以上rpm -q的[select-options]可以和p组合使用

[query-options]:

    --changelog:查询rpm包的changelog(历史改变日志),注意是rpm包,不是源程序包

        如:[root@localhost Packages]# rpm -q --changelog zsh

    -l或--list:查询程序包安装生成的所有文件列表,二进制文件、配置文件、库文件、帮助文件

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

        如:[root@localhost Packages]# rpm -qi zsh

    -c或--configfiles:查询指定程序提供的配置文件信息

        如:[root@localhost Packages]# rpm -qc zsh

    -d或--docfiles:查询指定的程序包提供的文档信息

        如:[root@localhost Packages]# rpm -qd zsh

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

        如:   [root@localhost Packages]# rpm -q --provides zsh

            config(zsh) = 5.0.2-25.el7

            zsh = 5.0.2-25.el7

            zsh(x86-64) = 5.0.2-25.el7

            [root@localhost Packages]# 

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

        如:[root@localhost Packages]# rpm -q -R zsh |less

    --scripts:查询指定程序包自带的脚本片段


rpm -q常用用法小结:

    -qi PACKAGE、-qf PACKAGE、-qc PACKAGE、-ql PACKAGE、-qd PACKAGE    //只需指定程序包名称即可

    -qpl PACKAGE_FILE、-qpi PACKAGE_FILE、-qpc PACKAGE_FILE    //需指定文件路径


7.5、rpm程序包校验:  

校验的作用:检验安装的程序包是否发生了变化。


7.5.1、包来源合法性验证和完整性验证:

来源合法性验证:

    数字签名:用自己的私钥去签名,用公钥去比对,是否一致。

       签名实现方法:①、加密者使用单向加密算法去加密程序包提取的校验码(特征码),定长输出;②然后用私钥去加密特征码,此即为数字签名,并将特征码附加在程序包后面。

       使用验证来源合法性:用加密者的公钥去解密特征码,若可以解密,则说明是加密者本人加密的,验证了来源合法。

完整性验证:

    使用者和加密者使用相同的加密算法去解密、加密程序包,也得到一段特征码,将此特征码与公钥解密的特征码进行比较,如果一致,则说明程序包未改变,完整性得到了验证。


7.5.2、光盘中公钥的位置:

    一般挂载光盘后,会在挂载点里看到:RPM-GPG-KEY-CentOS-7


注意:系统安装时,也会存储秘钥:存储位置:/etc/pki/rpm-gpg/

[root@localhost media]# cd /etc/pki/rpm-gpg/

[root@localhost rpm-gpg]# ls

RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Debug-7  RPM-GPG-KEY-CentOS-Testing-7

[root@localhost rpm-gpg]# 


7.5.3、导入秘钥   

    [root@localhost media]# rpm --import /media/RPM-GPG-KEY-CentOS-7

手动做公钥认证:

    [root@localhost Packages]# rpm -K zsh-5.0.2-25.el7.x86_64.rpm 

    zsh-5.0.2-25.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

    [root@localhost Packages]# 

    

7.5.4、验证:

    ①安装此组织签名的程序时,会自动执行验证

    ②手动验证:rpm -K PACKAGE_FILE


7.5.5、验证命令用法

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


7.6、rpm程序包数据库重建:

  rpm程序包数据库的位置:/var/lib/rpm

    [root@localhost rpm]# ls /var/lib/rpm

    Basenames     __db.002  Group       Obsoletename  Requirename  Triggername

    Conflictname  __db.003  Installtid  Packages      Sha1header

    __db.001      Dirnames  Name        Providename   Sigmd5

    [root@localhost rpm]# 

注意:rpm程序包的查询操作是基于此处的数据库(/var/lib/rpm目录下)进行的。


7.6.1、获取重建帮助

centos6:man rpm

centos7:man rpmdb


7.6.1、centos7重建数据库

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

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

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





8、rpm程序包管理(2)--程序包前端工具yum

前端管理工具实现介绍:

程序包前端管理是用来自动解决依赖关系,并自动安装有依赖关系的程序包。它有两部分组成:yum仓库和yum工具客户端。

所谓yum仓库就是将所有的文件放在一个共享文件夹或目录中,它可以是远程端的也可以是本地端的,然后对此文件夹或目录进行提取包相关简要信息--元文件信息(如名称、依赖等);客户端通过定义仓库的位置,下载元文件定义的软件信息,进行自动解决软件之间的依赖下载并进行安装。


centos前端管理工具:yum

可以将其看成一个c/s架构的程序


yum:yellow dog,yellowdog update modify

yum repository:简写成yum repo,yum仓库,存储了众多的rpm包,以及包的相关元数据文件(放置于特定目录下:repodata)


8.1、yum工具安装程序包的前提条件:

    ①本地主机有yum工具,可以通过rpm -q yum来进行查看

    ②要有yum仓库的配置,yum仓库的作用就是定义到哪里去下载程序包软件

    ③远方的yum仓库或者本地的yum仓库要存在,yum仓库的访问方式可以http、ftp、file三种方式中的一种。

注意:yum仓库不是用来替代rpm程序包管理工具的,它只是rpm包的前端管理工具,yum依赖于rpm工具。


8.2、yum仓库制作:

    可以通过命令:createrepo来完成。

careaterepo分析指定的仓库下有哪些程序包,各程序包之间的依赖关系及元文件的特征码信息。

注意:createrepo不是完美的,下一个替代解决方案是dnf工具,createrepo创建高级仓库有限制,如创建一个yum仓库程序包组。


8.3、yum仓库类别:

    远方yum仓库:

        http://

        ftp://

        nfs://

    本地yum仓库:

        file:///

8.4、查看yum工具是否安装

[root@localhost rpm]# rpm -q yum   //查看是否安装yum工具

yum-3.4.3-150.el7.centos.noarch

[root@localhost rpm]# rpm -qc yum    //查看yum程序的配置文件

/etc/logrotate.d/yum

/etc/yum.conf        //yum的主配置文件,为所有yum仓库提供公共配置,/etc/yum.repos.d/*.repo为自定义仓库配置

/etc/yum/version-groups.conf

[root@localhost rpm]# 


8.5、yum仓库配置文件帮助:

[root@localhost rpm]# whatis yum.conf

yum.conf (5)         - Configuration file for yum(8).

[root@localhost rpm]# whereis yum.conf

yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8


8.6、yum仓库的定义:

查看yum仓库:

   [root@localhost yum.repos.d]# yum repolist 

 


8.6.1、yum仓库公共配置(/etc/yum.conf ),一般不需要更改此处配置


    [main]    //仓库ID,需要唯一标识

    cachedir=/var/cache/yum/$basearch/$releasever    //缓存元文件、程序包路径

    keepcache=0    //不缓存

    debuglevel=2

    logfile=/var/log/yum.log 

    exactarch=1

    obsoletes=1

    gpgcheck=1  //gpg检查

    plugins=1

    installonly_limit=5

    bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum

    distroverpkg=centos-release


8.6.2、自定义仓库配置


    [RepositoryID]    //仓库ID,不可以重复

    name=CentOS-$releasever - Base  //仓库名字信息

    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra  //仓库baseusrl列表信息,和baseurl互斥

    baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/    //定义仓库的地址

       http://mirror.aliyum.com/centos/x86_64/repoate        //多个仓库地址时按此种方式书写

    gpgcheck={1|0}    //定义是否启用包来源合法性及完整性检查

    enabled={1|0}   //定义是否启动仓库,默认启用

    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7  //定义gpgkey秘钥文件路径

    enablegroup={1|0} //是否启用组来批量管理程序包,默认启用

    failovermethod={roundrobin |priority} //定义当多个url时怎么选路径,roundrobin为轮询 ,priority为优先级,默认为轮询方式

    keeplive={1|0}

    cost=1000  //开销,默认为1000

注意:repodata所在路径,应是yum仓库的路径,即baseurl路径



8.6.3:yum配置文件中的可用变量介绍:

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

&arch:平台版本,如i386,x86_64

$basearch:基础平台版本号,32位、64位

$YUM0-YUM9:10个自定义的变量,如果需要可以定义。


8.6.4、创建yum仓库----使用createrepo命令 (跳过此节,看完8.8节更易理解)

注意:首先要确定createrepo工具存在,如不存在,则需要安装(yum install -y createrepo)


命令格式

 createrepo [options] <directory>


8.7、yum命令使用:

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

[command]

        * install package1 [package2] [...]

        * update [package1] [package2] [...]

        * update-to [package1] [package2] [...]

        * update-minimal [package1] [package2] [...]

        * check-update

        * upgrade [package1] [package2] [...]

        * upgrade-to [package1] [package2] [...]

        * distribution-synchronization [package1] [package2] [...]

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

        * autoremove [package1] [...]

        * list [...]

        * info [...]

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

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

        * makecache [fast]

        * groups [...]

        * search string1 [string2] [...]

        * shell [filename]

        * resolvedep dep1 [dep2] [...] (maintained for legacy reasons only - use repoquery or yum provides)

        * 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]

        * repoinfo [all|enabled|disabled]

        * repository-packages   <enabled-repoid>   <install|remove|remove-or-rein‐stall|remove-or-distribution-synchronization> [package2] [...]

        * 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]

        * updateinfo  [summary  | list | info | remove-pkgs-ts | exclude-updates |exclude-all | check-running-kernel]

        * fssnapshot [summary | list | have-space | create | delete]

        * fs [filters | refilter | refilter-cleanup | du]

        * check

        * help [command]


8.7.1、显示仓库列表、仓库信息、仓库中的程序包

   repolist [all|enabled|disabled]    //显示有哪些仓库,可以显示所有的、启用的、禁用的;默认是enabled

    如:[root@localhost Packages]# yum repolist 

   repoinfo [all|enabled|disabled]    //显示仓库的信息

   list [...]  //显示仓库中有哪些程序包

     yum list [all | glob_exp1] [glob_exp2] [...]  //列出已安装的所有包,或过滤指定的包

     yum list available [glob_exp1] [...]    //列出可用的程序包,尚未安装的包

     yum list updates [glob_exp1] [...]    //列出可用升级包

     yum list installed [glob_exp1] [...]   //列出已安装的程序包

     yum list extras [glob_exp1] [...]    //列出额外的程序包

如:

[root@localhost yum.repos.d]# yum list | less

Loaded plugins: fastestmirror, langpacks

Loading mirror speeds from cached hostfile

 * base: centos.ustc.edu.cn

 * extras: centos.ustc.edu.cn

 * updates: centos.ustc.edu.cn

Installed Packages

GeoIP.x86_64                               1.5.0-11.el7                @anaconda    //@anaconda表示安装系统时安装的包

389-ds-base-snmp.x86_64                    1.3.5.10-21.el7_3                updates     //可升级安装的包

ElectricFence.i686                         2.2.2-39.el7                  base     //基础包

WALinuxAgent.noarch                        2.2.14-1.el7                  extras   //额外的包


8.7.2、安装程序包:只需提供包名即可 ;rpm -i,需提供文件路径

    install package1 [package2] [...]     //安装程序包

    reinstall package1 [package2] [...]    //重新安装程序包

注意:如果一个程序包有多个版本,可以安装指定的版本。


8.7.3、升级程序包: rpm -U | -F

    update [package1] [package2] [...]   //升级指定程序包

    update-to [package1] [package2] [...] //当有多个版本时,可以指定升级到哪个版本

    update-minimal [package1] [package2] [...]  //升级到离当前版本最近的版本


降级程序包:

     downgrade package1 [package2] [...]



8.7.4、检查有哪些升级包可用:

    check-update



8.7.5、卸载程序包: rpm {-e | --erase}

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

注意:下载程序包时,那么依赖于此程序的包也会被卸载。如:安装gcc时依赖cpp,那么卸载cpp,gcc也会被卸载掉。


8.7.6、查看程序包信息:类似rpm -qi

   info [...] 


8.7.7、查看程序由哪个程序包提供;类似 rpm -q --provides

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


8.7.8、清空本地缓存:元数据和程序包会缓存到本地,但是安装后,只会删除程序包

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


8.7.9、创建缓存

    makecache [fast]

如:

[root@localhost ~]# yum makecache 

Loaded plugins: fastestmirror, langpacks

base                                                            | 3.6 kB  00:00:00     

extras                                                          | 3.4 kB  00:00:00     

updates                                                         | 3.4 kB  00:00:00     

(1/2): extras/7/x86_64/prestodelta                              |  51 kB  00:00:00     

(2/2): extras/7/x86_64/other_db                                 |  87 kB  00:00:00     

Loading mirror speeds from cached hostfile

 * base: centos.ustc.edu.cn

 * extras: centos.ustc.edu.cn

 * updates: centos.ustc.edu.cn

Metadata Cache Created

[root@localhost ~]# 


8.7.10、搜索仓库中的程序包(模糊匹配),以指定关键字搜索程序包及summary信息;

    search string1 [string2] [...]


8.7.11、显示程序包的依赖关系:显示所依赖的程序包以及由哪个程序提供

    deplist package1 [package2] [...]


8.7.12、查看rpm程序包的db信息

    version [ all | installed | available | group-* | nogroups* | grouplist |groupinfo ]


8.7.13、查看yum事物历史信息(只会在安装、修改、卸载时产生,查询不会)

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


8.7.14、安装及升级本地程序包:当程序包不在仓库中时,可以使用此种方法

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

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

 

8.7.15、包组管理的相关命令:

    group install

    group  list

    group  remove

    group  info

    group  update



8.7.16、

每个发行版的软件包里都有repodata,因此可以定义本地光盘为yum安装源,步骤如下:

1、[root@localhost ~]# mount /dev/cdrom /media/

mount: /dev/sr0 is write-protected, mounting read-only

2、[root@localhost ~]# cd /media/   //进入cdrom光盘会看到一个repodata文件,此文件所在目录即为仓库所在目录

[root@localhost media]# ls

CentOS_BuildTag  GPL       LiveOS    RPM-GPG-KEY-CentOS-7

EFI              images    Packages  RPM-GPG-KEY-CentOS-Testing-7

EULA             isolinux  repodata  TRANS.TBL

[root@localhost media]# 

3、[root@localhost media]# cd /etc/yum.repos.d/    //在此目录下创建一个仓库配置文件

[root@localhost yum.repos.d]# vim local.repo

[localrepo]

name="this is a local repo"

baseurl=file:///media/

enabled=1

gpgcheck=0


8.8、yum命令使用:

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

[options]:

    --nogpgcheck  //不做gpgcheck检查

    -y:自动回复为yes

    -q:静默模式执行

    --disablerepo=repoidglob:临时禁用配置文件中此处指定的repo配置文件

    --enablerepo=repoidglob

    --noplugins:禁用所有插件

 





9、程序包的编译安装

源代码程序需要经过预处理--->编译--->汇编--->链接--->执行,完成二进制文件的制作。此时用rpm工具可以安装,如果是源代码的程序则需要对其进行编译安装。

步骤如下:(c、c++借助项目管理工具make进行编译安装)


项目管理工具的作用:

解决多文件之间的依赖关系。

自动解决从源代码--->预处理--->编译--->汇编--->链接--->执行。


项目管理工具make的作用:

    make借助makefile文件(他是make的配置文件)来进行编译安装。

    makefile文件是由makefile.in模板文件生成的

    configure文件会指定编译的相关参数,然后结合makefile.in文件,生成makefile文件


9.1、编译安装的三步骤:

①、 ./configure   //作用是:通过选项传递用户指定的参数,指定启用特性、安装路径等;执行时会参考用户的指定以及makefile.in文件生成makefile文件;检查依赖到的外部环境,注意如果./configure错误,则无法执行下一步make操作。

②、make    //根据makefile文件,构建应用程序

③、make install  //将程序的四种组成文件复制到./configure指定的路径参数下。

注意:项目构建工具可生成configure脚本和makefile.in文件,但是不是必须的,项目构建工具生成的上述两个文件依赖开发工具:autoconf和automake

    autoconf:生成configure脚本文件

    automake:生成makefile.in文件

建议:安装前查看INSTALL文件或README文件。


9.2、开源程序的获取途径:

    官方自建站点:如maridb.org、apache.org

    代码托管站点:

        https://sourceforge.net/

        http://github.com/


9.3、编译安装c、c++程序

编译安装c、c++源代码的前提条件:

    开发工具:make、 gcc

    开发环境:开发库、以及头文件要存在、glibc(c代码的标准库)


通过包组提供开发组件:

    centos6:development tools、server platform development

    centos7:development tools



9.4、编译安装源代码步骤:

①、configure脚本:

    选项:指定安装位置,指定启用的特性(注意:不同源代码选项可能不一样)

    --help:获取其支持的选项

    选项分类:

        安装路径设定:指定安装路径的好处是便于软件卸载。

        --prefix=/PATH/TO/SOMEWHERE :指定默认安装位置,如果不指定路径,则在当前路径下(/usr/local)创建:创建etc目录放置配置文件、创建bin目录放置二进制文件、创建lib目录放置库文件;

        --sysconfdir=/PATH/TO/SOMEWHERE :配置文件的安装位置

        system types:指明编译时的平台是什么,交叉编译时会用到

        optional feature:可选特性

            --disable-FEATURE:禁用某特性

            --enable-FEATURE[=ARG]:启用某特性

        optional packages:可选包

            --with-PACKAGE[=ARG]

            --without-PACKAGE

②、make

③、make install


9.5、安装源代码程序后的后续配置

    ①、导出二进制程序目录至PATH环境中:

        编译文件:/etc/profiled/NAME.sh 在里面输入如下语句:

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

         然后重读下文件。

    ②、导出库文件路径:

        编译/etc/ld.so.conf.d/NAME.conf在里面输入,如下:

            /usr/local/apache/lib

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

    ③、导出头文件:

        创建链接:可以导出整个目录为一个链接文件,也可以为每个文件单独导出链接。

        基于符号链接文件实现:ln -sv

    ④、导出帮助文件:

        编译:/etc/man.config 添加手册所在路径即可,如下:

        MANPATH=....


10、编译安装示例:安装apache2.2

①、下载源码程序包:

    [root@localhost tmp]# wget http://mirrors.sohu.com/apache/httpd-2.2.34.tar.bz2

②、解压文件

    [root@localhost tmp]# tar -xjvf httpd-2.2.34.tar.bz2 

并进入目录:

[root@localhost tmp]# cd httpd-2.2.34/

[root@localhost httpd-2.2.34]# ls

ABOUT_APACHE  config.layout  httpd.spec      LICENSE        README.platforms

acinclude.m4  configure      include         Makefile.in    README-win32.txt

Apache.dsw    configure.in   INSTALL         Makefile.win   ROADMAP

build         docs           InstallBin.dsp  modules        server

BuildAll.dsp  emacs-style    LAYOUT          NOTICE         srclib

BuildBin.dsp  httpd.dep      libhttpd.dep    NWGNUmakefile  support

buildconf     httpd.dsp      libhttpd.dsp    os             test

CHANGES       httpd.mak      libhttpd.mak    README         VERSIONING

[root@localhost httpd-2.2.34]# 


③、编译安装参数./configure

[root@localhost httpd-2.2.34]# ./configure --help    //获取编译参数帮助

定义参数:为了便于卸载,建议指定安装目录

 [root@localhost httpd-2.2.34]# ./configure --prefix=/usr/local/apache

④、构建应用程序

 [root@localhost httpd-2.2.34]# make

⑤、安装应用程序,即将程序组成各文件复制至相应目录下

 [root@localhost httpd-2.2.34]# make install