我们知道在安装某一个软件时,有些我们不需要安装的程序或者特性被安装到系统上去了,而我们需要的程序或者特性没有被安装进去,或者说该软件存在一些漏洞等等因素,我们都需要修改该软件的源代码,然后在重新编译生产一个二进制文件,最后用户才可以安装这个二进制文件。
我们知道系统真正识别的文件其实只有二进制文件,而某个软件的原始码就是就是一段程序,而这类程序是供人看的,系统并不识别,因此为了让系统能够识别这段原始码的内容,必须要对原始码进行转换,转换成系统能够识别的二进制程序。而原始码转换成二进制文件需要借助编译器来完成。
所谓编译器就是将程序代码解析成系统能够识别的二进制程序。
所以我们可以这样来理解原始码、编译器、二进制程序的概念
原始码:就是我们常说的程序代码
编译器:将原始码转换成二进制文件
二进制文件:就是系统能够识别的程序
其中在大多linux distribution中使用最多的编译器就是gcc了。而在编译的过程中,我们可能会调用某一些已经存在的库文件,这些库文件可以来完成某些功能的。切记,函数库是不能自动执行的,只有被调用,这个库文件的内容才会发挥作用。并且函数库分为静态和动态函数库。
在整个编译的过程中包括如下步骤:
一、准备好开发环境或者编译环境
这其中的编译环境主要包括以下几点:
1、 是否有合适的编译器可以编译该软件的原始码,例如是否有gcc等编译器
2、 该软件所需要的函数库是否存在,以及该软件所依赖的其他软件
3、 该软件是否适合该操作系统
4、 内核的表头文件(header include)是否存在
如果该编译环境不符合的话,可能在安装过程中出现错误,以至于安装失败
二、安装"Development Tools"和"Development Libraries"
三、编译及安装
其实使用gcc类似的编译器来编译程序过程比较复杂,除了每一个程序需要写上一段代码之外,还
需要写上最终的链接程序。而我们使用make这个项目管理工具就可以简化整个编译过程。
make的工作机制:make其实也是一只程序,当make执行时,make会在当前目录下搜索
Makefile(或者makefile)这个文本文件,该文件记录了原始码如何被编译的详细信息。而makefile
这个文件是由configure这个程序产生的。Configure这个程序主要是用来检测编译环境和在编译的过
程中让用户选择编译特性的。如果检测不成功,那么安装也不会成功。在检测环境完成后,就会
生产makefile文件。
因此编译和安装又可以分为如下步骤:
1、 默认原始码文件为*.tar.gz的,所以需要使用tar命令来解压缩,解压缩后的文件放在/usr/local/src目录下
2、 使用cd命令切换到原始码所在的目录
3、 运行configure这个程序检测编译环境,产生makefile文件
在运行configure这个程序时,后面可以加上一些参数,这些参数可以改变某些编译特性。例如:
--help:显示所有的编译参数
--prefix=/path/to/somewhere:指定软件安装后的产生文件的位置
--conf-path=/path/to/somefile:指定软件的配置文件
--sysconfdir=/path/to/somewhere:指定配置文件的目录
4、使用make命令根据makefile文件中的参数进行编译
5、使用make install命令来安装
我们知道一个程序的组成一般包括:二进制程序,函数库、配置文件、帮助文件等
其中这个二进制程序如果要运行的话,必须使用全路径名称来运行,因为PATH变量中没有这个二进制文件路径。或者直接修改PATH变量,让其能够识别此程序的二进制文件路径。
修改PATH变量的方法有两种:
一、直接修改/etc/profile文件,修改PATH变量的值
二、在/etc/profile.d目录下建立一个以.sh为名称后缀的文件,在这里添加一行
export PATH=$PATH:/path/to/somefile
而库文件默认存放在/lib,/usr/lib目录下。要增添额外的搜索路径可以这么做:
在/etc/id.so.conf.d/中创建以.conf为后缀的文件,而后把要增添的路径直接写在此文件中;
使用idconfig命令可以通知系统重新搜索库文件
其中-v:显示重新搜索库文件的过程
头文件:输出给系统
默认:/usr/include
增添头文件搜寻路径,使用链接进行:
/usr/local/tengine/include/ /usr/include/
两种方式:
ln -s /usr/local/tengine/include/* /usr/include/ 或
ln -s /usr/local/tengine/include /usr/include/tengine
该软件产生的帮助文件默认存放在指定目录下的man目录下。为了可以使用man命令查询可以这样做:
1、man -M /PATH/TO/MAN_DIR COMMAND
2、在/etc/man.config中添加一条MANPATH