开放源码软件的安装
1.基本概念
开放源码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行
编译程序:将程序代码转换成机器能够看懂的语言,类似翻译者的角色
可执行程序:经过编译程序变成二进制程序后机器看的懂所以可以执行的文件。
函数库:类似子程序的角色,可以被调用来执行的一段的一段功能函数。
一个软件是否可以安装,即是否可以成为可执行程序,必须对安装环境进行检测,检测程序(configure或者config等文件)
检测的内容包含以下数据:
1)是否有适合的编译程序可以编译本软件的程序代码;
2)是否存在本软件所需要的函数库或者其他需要的相关软件;
3)操作系统平台是否适合软件,包括linux的内核版本;
4)内核的头定义文件(header include)是否存在(驱动程序必须要的检测)。
Tarball:就是一个经过Tar打包和gzip或者bzip2打包压缩后的.tar.gz或者.tar.bz2的软件包。里面主要包含三部分内容:
1)源代码文件 2)检测程序文件(可能是configure或者config等文件名)
3)本软件的简,易说明和安装说明(INSTALL或README),很重要,参考他们可实现tarball的安装。
2.安装和升级
安装升级的方式大概有二种:
1)直接将软件源代码通过编译来安装与升级。
2)直接以编译好的二进制程序安装升级,厂商针对自己的平台事先编译出自己平台的二进制程序。在相同的平台只需要安装
就可以,省略检测和编译的过程。例如Redhat系统(fedora、centOS等)开发的RPM软件管理机制和YUM在线跟新模式。
tarball的安装流程:
1)将tarball由厂商的网页下载下来;
2)将tarball解压缩,生成许多的源文件;
3)开始gcc进行源码的编译(会生成可执行文件)
4)然后以gcc进行函数库,主程序,子程序的链接,以形成主要的二进制文件;
5)将上述的二进制文件以及相关的配置文件安装到自己的主机上面。
上面的3.4步骤可以通过make(写makefile)这个命令的功能来简化它。
3.gcc的简易用法
1)将编译的源码制作成目标文件,但不制作链接等功能;
gcc -c hello.c 会生成hello.o文件,并不会生成可执行文件
2)在编译的时候,依据环境优化执行速度
gcc -O hello.c -c 会生成hello.o文件,并且进行了优化。
3)在进行二进制文件的制作时,将链接的函数库与相关的路径填入(这些路径不在默认的位置时需要)
gcc sin.c -lm -L/usr/lib -I/usr/include
* -lm 指的是libm.so或者libm.a这个函数库
* -L后面接的路径是刚才上面那个函数库的搜索目录
* -I后面接的是源码内的includ文件的所在位置
4.make的优点
1)通过makefile文件简化编译时所需要执行的命令。
2)若在编译完成以后,修改了某个源代码,则make仅会对被修改了的文件进行编译,其他的目标文件不会被修改。
3)最后可以依照相依性来更新执行文件。
5.makefile的基本语法和变量
目标(target):目标文件1 目标文件2
<Tab> gcc -o 欲新建的可执行文件 目标文件1 目标文件2
eg :
vim makefile
main:main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main.o haha.o sin_value.o cos_value.o
*命令行必须以Tab键开头
*目标于目标文件之间以”:"隔开
以上makefile制作了二个执行操作,执行main 输入 make main即可,执行clean 输入make clean即可,如果想要清除在编译
则使用 make clean main就可以了
变量可以像shell script一样 上面的makefile可以改写成
vim makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: $(OBJS)
gcc -o main $(OBJS) $(LIBS)
clean:
rm -f $(OBJS)
*变量于变量内容以 = 隔开,二边可以有空格
*变量左边不可以有Tab
*变量最好以大写字母,注意使用$符号对变量应用。
6.tarball安装基本步骤
1)获得源文件,将Tarball文件放在/usr/local/src目录下解压缩
2)获得步骤流程,查阅解压缩文件中的INSTALL和README
3)相关属性软件安装,根据INSTALL和README的内容查看并安装好一些相关的软件(非必要)
4)建立makefile:以自检测程序(configure或者config)检测操作环境,并建立makefile文件
5)编译:以make这个程序并使用目录下的makefile作为他的参数配置文件,来进行make(编译,清除等)的操作。
6)安装:以make这个程序,并以makefile这个配置文件,依据install这个目标(targe)来制定正确的安装路径.
7.tarball软件安装的命令执行方式
1)./configure 这个步骤是为了建立makefile的,主要通过Script来检测linux系统的相关属性
2)make clean make读取makefile中的clean目标。建议编译前都执行此步骤,防止上次编译目标文件的残余
3)make make将会按照makefile中的默认工作进行编译,编译的工作主要是进行gcc将源代码编译成可被执行的目标代码 ,
但是这些目标代码还需要一些库函数之类的连接后,才能成为一个完整的可执行文件。
4)make install make会执行makefile中的install操作,将上一步编译的数据安装在默认的目录,完成安装
*以上只要有一步骤不成功,安装就不会成功。
8.tarball软件安装的建议
1)最好将tarball的原始数据解压缩到/usr/local/src当中;
2)安装时,最好安装到/usr/local这个默认路劲中
3) 考虑到将来反安装的步骤,最好将每个软件单独安装在/usr/local下面
4)为安装的单独目录的软件man page加入man path搜索
*如果你安装的软件放在/usr/local/software/中,那么在man page搜素的设置中就要在/etc/man.config内的40-50行左右加入
MANPATH/usr/local/software/man 这样才能通过man来查询软件的在线帮助文档。
9.利用patch跟新源码(不用再下载完整的Tarball)
1)patch跟新的思想和好处:没有改动过的文件的目标文件根本就不需要在进行编译,而且动过的文件又可以通过make来自动的update。
如此以来,我们原先的设置(makefile文件里的规则)将不需要进行重新改写或者检测,可以节省很多时间。
2)具体做法:找出源代码的旧版与新版的差别(用diff命令),再通过相关命令(patch)进行更新。所以软件开发商在跟新源码后,
都会提供所谓的patch file(补丁)文件,用来直接跟新源码。
3)diff与patch的例子:
假设有二个文件包 main-0.1.tgz main_0.1_to_main_0.2.patch 在/root目录下
tar -zxf main-0.1.tgz 解压缩源文件包
cd main-0.1 进入文件main-0.1
patch -p1 < ../main_0.1_to_main_0.2.patch 目前在main.0.1目录,注意patch文件的相对路径
make clean main
./main
make install 安装
main 直接输入命令就执行
*注意:pctch文件只是对源码的更新并不是对软件的更新,还是需要对软件进行编译后才能得到最终正确的软件!!因为patch的功能
只是更新源码而已。要牢记。
*patch必须存在才能完成二个版本的源码更新,不能实现源码的跨版本更新,例如kernel2.4.xx和kernel2.6.xx,是无法使用patch
文件来更新的,他们架构都不一样了。假设kernel2.4.20更新到kernel2.4.26,就必须使用patch2.4.21 2.4.22 2.4.23 ... 2.4.26六个文件
“依次更新”才可以。
10.函数库管理
1)动态函数库 扩展名 libxxx.a的类型
2)静态函数库 扩展名 libxxx.so的类型
3)目前linux大多是将函数库做成动态函数库,再来就是需要增加函数库的读取性能,将常用的函数库加载到内存当中(缓存,cache)
如此一来,当软件使用动态函数库时,就不需要从硬盘中读取,这样就增进了动态函数库的读取速度。
4)如何将动态函数库加载到高速缓存?
a.首先,我们将/etc/ld.so.conf里面写下想要读入高速缓存当中的动态函数库所在的目录!是目录不是文件。
b.接下来就是利用ldconfig这个可执行程序将/etc/ld.so.conf的数据读入缓存。
c.同时也将数据记录一份在/etc/ld.so.cache这个文件中。
11.函数的动态库解析:ldd
1)如何判断可执行程序的二进制文件含有哪些动态的函数库?利用ldd就可以了。
2)例如想知道/usr/bin/passwd这个程序含有那些动态库。可以这样做:
ldd /usr/bin/passwd 找出这个文件的函数库数据