一、编译安装概述


前面两篇关于程序包管理器的文章谈到,无论是使用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源代码为例):

wKioL1jDVvnxC_pvAAGeubhfReg191.jpg

我们知道,程序源代码一般为多文件组织格式,因此文件中的代码文件之间很有可能存在跨文件的依赖关系,这将给用户自行编译安装带来了极×××烦,因为对先编译哪些文件、后编译哪些文件根本无从知晓,因此这就需要项目管理器(或者项目构建器)了。C/C++的项目管理器为make,make工具可以在编译过程中指定使用哪个预处理器进行预处理、使用哪个编译器进行编译以及先编译什么程序文件、后编译什么程序文件,甚至完成更为复杂的操作等,能帮助用户快速地编译安装。make工具的执行依赖于makefile配置文档,因此make执行的所有操作皆由makefile指定。makefile可由执行configure脚本生成。而在执行configure脚本时,configure会结合用户通过命令行指定的选项以及各个Makefile.in模板文件来生成makefile文件。编译完成之后即可使用make install命令将编译好的程序包复制到用户指定的各个目录下。



二、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:不安装指定依赖包;


执行configure脚本的作用:

①用户可以通过选项传递参数给configure脚本,以指定启用的功能特性、安装路径等;而configure脚本在执行的过程中会参考用户的指定以及Makefile.in文件生成makefile文件;

②检查程序指定要启用的功能特性所依赖到的外部环境。


(2) 执行make程序

作用:

make会执行真正的编译操作,但make本身并不是编译器,它只是一个项目构建工具,make程序会根据执行configure脚本所生成的makefile文件,并调用所需要用到的编译器来构建应用程序。


(3) 执行make install安装操作

作用:

在前面的make程序执行之后,在当前目录下会创建出已编译完成的目标二进制格式的应用程序(包括二进制程序、库文件、配置文件及帮助文档等),而make install则会执行安装操作,即把当前目录下已编译好的程序包(二进制程序、库文件、配置文件及帮助文档等)复制到用户指定的各个目录下。


注意:各个程序在编译安装过程中可能不尽相同,因此建议安装前查看INSTALL, README。



三、编译安装后的配置


(1) 导出目标二进制程序目录至PATH环境变量中

方法:

在生产环境中如果该二进制程序作为全局变量,可以在/etc/profile.d/目录下创建/etc/profile.d/NAME.d文件,其中'NAME'可定义设置名称。在该文件中写入下面一行:

export PATH=PATH:/PATH/TO/BIN

这里的/PATH/TO/BIN即为目标二进制程序所在目录。

如果要想编译后的命令程序优先被查找到,可以添加在环境变量PATH的前面,如下:

export PATH=/PATH/TO/BIN:PATH


(2) 导出库文件路径

方法:

①在/etc/ld.so.conf.d/目录下创建/etc/ld.so.conf.d/NAME.conf,其中NAME为自定义设置名称。而后,添加新的库文件所在目录至此文件中即可。

②做完这一步之后,需要让系统重新加载库文件(重新生成缓存):

# ldconfig [-v]


查看当前系统上已加载的库文件:

# ldconfig -p


(3) 导出头文件(位于include目录)

程序编译安装完成之后,一般在安装路径中会有include目录,这个include目录就是头文件,头文件的功能是把外部文件的内容包含到源文件中,例如外部函数等。在程序开始编译之前,会执行一段预处理指令,而预处理指令则把头文件的内容包含到源文件中。

如果要导出头文件,可基于软链接的方式来实现:

# ln -sv  头文件目录  链接头文件目录(/usr/include/NAME)

这里链接头文件目录一般为/usr/include/NAME,其中NAME可以是程序名,例如/usr/include/httpd。


(4) 导出帮助手册

方法:

在CentOS 6上:

编辑/etc/man.config文件,添加一个MANPATH:

# MANPATH /PATH/TO/MAN

这里'/PATH/TO/MAN'为目标程序的安装路径下的帮助手册目录。


在CentOS 7上:

编辑/etc/man_db.conf文件,添加一个MANPATH:

# MANPATH_MAP /PATH/TO/BIN    /PATH/TO/MAN

这里/PATH/TO/BIN是目标二进制程序所在目录,/PATH/TO/MAN则是该程序的帮助手册所在目录。