linux源码编译安装软件原理
一.关于软件包
在linux中安装软件是需要安装包的,软件的安装包有各种类型:.zip,.rar,.rpm,.tar.gz,.tar。软件包还可以分为源代码包和二进制
包,源代码包是没有经过编译的包,需要经过GCC、C++编译器环境编译才能运行。二进制包无需编译,可以直接安装使用。区分是否为
源代码包还是二进制包还得基于软件包里面的文件来判断,包含.h、.c、.cpp、.cc等结尾的源码文件,称之为源代码包,而软件包里面存
在bin目录(bin目录里有可执行文件),称之为二进制包。源码包高度可定制,可以自由选择自己需要的功能。
二.软件编译过程
1.将源码编译成可供Linux运行的二进制文件一共需要两步:
- 使用gcc编译器将源码编译成目标文件
- 再次使用gcc编译器将目标文件链接成二进制文件
这过程看似简单,实则不然。一个软件的源代码往往被封装在多个源文件中,此外这些文件有错综复杂的依赖关系,编译需要严格按照指
定的顺序进行,这无疑增加了编译的难度。好在make命令可以帮助我们简化编译过程。整个编译过程被浓缩在Makefile文件中(告诉
make命令需要怎么去编译和链接程序),当执行make命令时,make会去当前目录中寻找Makefile文件,并根据该文件中的要求完成整个
编译过程。而Makefile文件由configure命令产生。当执行configure命令时,configure会根据当前系统环境动态生成一个适合本系统的
Makefile文件,供make命令使用。
2.Linux源码安装步骤
- 获取源码并解压
- 查看INSTALL与README文件:解压后查看INSTALL与README文件,这两个文件中详细介绍了软件的安装方法和注意事项
- 创建Makefile文件:执行configure命令,生成Makefile文件
- 编译:执行make clean;make命令将源码编译成二进制文件。PS:make clean命令用来清除上一次编译生成的目标文件,这个步骤可有可无,但为了确保编译的成功,还是加上为好,防止由于软件中含有残留的目标文件导致编译失败
- 安装:执行make install命令将上一步编译好的二进制文件安装到指定的目录中去
三.编译安装常用参数
# ./configure
a. 指定安装路径,例如 --prefix=/usr/local/nginx
b. 启用或禁用某项功能, 例如 --enable-ssl, --disable-filter --with-http_ssl_module
c. 和其它软件关联,例如--with-pcre
d. 检查安装环境(检查依赖到的外部环境),例如是否有编译器gcc,是否满足软件的依赖需求
最终生成:Makefile
# make -j 4 #按Makefile文件编译,可以使用-j 4指定4核心CPU编译,提升速度
# make install #按Makefile定义的文件路径安装
# make clean #清除上次的make命令所产生的object和Makefile文件。使用场景:当需要重新执行configure时,需要执行make clean
#make uninstall #删除安装包,有时删除不干净,所以建议大家安装时,在configure步骤添加一个: --prefix 参数。这样删除或备份时,直接对删除--prefix指定的安装目录操作就可以了。
四.源码编译出错的解决思路
1.首先编译软件需要各种编译器,各种依赖包,编译之前先安装软件的依赖包能减少出错。注意查看INSTALL与README文件,这两个文
件详细介绍了软件的安装方法和注意事项;
2.根据./configure的报错信息来解决问题,缺少依赖包就安装依赖包。如果知道缺少依赖软件名,但是不知道依赖包,可以使用yum
search 软件名,查看属于哪个依赖包,然后安装;
3.可以使用http://www.rpmseek.com/index.html查找需要的软件。
五.各种软件安装方法的特点
- 使用yum 或者rpm直接安装软件:操作方便,软件版本低(稳定版),稳定性好,管理方便,性能稍差;
- 源码编译安装软件:操作麻烦,软件版本新,可以定制,稳定性稍差,管理稍差,性能好。