【正经教程】Linux基础(十二):源码安装与Tarball
写在前面:GNU General Public License (CPL)
GNU = GNU's is Not UNIX
取得软件与源代码:你可以根据自己的需求来使用这个自由软件;
复制:你可以自由地复制该软件;.
修改:你可以将取得的源代码进行程序修改工作,使之适合你的工作;.
再发行:你可以将你修改过的程序,再度自由发行,而不会与原先的编写者冲突;
回馈:你应该将你修改过的程序代码固馈于社区。但请特别圄意,你所修改的任何一个自由软件都不应该也不能这样
修改授权:你不能将一个G P L授权的自由软件,在你修改后而将它取消G P L授权
单纯销售:你不能单纯销售自由软件。
开放源码的软件安装与升级简介
make 与 configure
make
当执行make时,make会在当前的目录下查找Makefile(or makefile)这个文本文件,而Makefile里面则记录了源代码如何编译的详细信息。make会自动地判别源代码是否经过变动了,而自动更新执行文件,是软件工程师相当好用的一个辅助工具
通常软件开发商都会写一个检测程序来检测用户的操作环境,以及该操作环境是否有软件开发商所需要的其他功能,该检测程序检测完毕后,就会主动地建立这个Makefile的规则文件,通常这个检测程序的文件名为configure或是config
环境检测主要是看看以下这些内容:
是否有适合的编译器可以编译本软件的程序代码;
是否已经存在本软件所需要的函数库,或其他需要的依赖软件;
是否有适合的编译器可以编译本软件的程序代码;
是否已经存在本软件所需要的函数库,或其他需要的依赖软件;

实际上在源码编译过程中,用户要做的只有两件事
- 执行
configure来生成Makefile文件 - 使用
make依据Makefile中的内容来进行编译
Tarball软件
简而言之:这是个压缩了的软件包。解压之后就是你安装所需要的全部文件。
一般解压之后会有这些东西:
- 源代码文件
-检测程序文件(可能是configure或config等文件);
-本软件的简易说明与安装说明(INSTALL或README)
不简而言之的说法如下:
所谓的Tarball文件,其实就是将软件的所有源代码文件先以tar打包,然后再以压缩技术来压缩,通常最常见的就是以gzip来压缩。因为利用了tar与gzip的功能,所以Tarball文件一般的扩展名就会写成.tar.gz或是简写为tgz,不过,近来由于bzip2与汩的压缩率较佳,所以Tarball渐渐地以bzip2及汩的压缩技术来替换gzip,因此文件名也会变成.tar.bz2、tar.xz之类的。
两大类安装方式:
1. 直接以源码通过编译来安装
(就是使用Tarball 基本等于全手动操作,自主性高但是麻烦)
2. 直接以变编译好的二进制程序来安装和升级
Linux发行版厂商能够针对自己的操作平台先进行编译等过程,再将编译好的二进制程序发布的话,那由于我的系统与该Linux发行版的环境是相同的,所以它所发布的二进制程序就可以在我的机器上面直接安装,省略了检测与编译等繁杂的过程。使用一些包管理软件基本是采用这种安装方法,省事不用动脑子。(包管理软件在下一章节)
Tarball的安装流程:
- 将Tarball由厂商的网站下载
- 将Tarball解开,产生很多的源代码文件;
- 开始以gcc进行源代码的编译(会产生目标文件object files);
- 然后以gcc进行函数库、主、子程序的链接,以形成主要的二进制文件;
- 将上述的二进制文件以及相关的配置文件安装至自己的主机上面
使用传统程序语言进行编译的简单例子
以C语言为例的简单说明
以c语言为例嘛。
.c →(编译) .o (object 目标文件) →(链接link) .out (可执行文件)
object目标文件还是挺有用的。可以防止在编译复杂项目时的多次重复编译。

调用外部函数:加入链接的函数库
- 编译时加入额外函数库的链接
 - Include的搜索路径配置

用make进行宏编译
make的优势:
这make好就好在它可以整合多个文件一起进行编译。自动化的识别好文件之间的关系和依赖性。
- 简化编译时所需要执行的命令;
- 若在编译完成之后,修改了某个源代码文件,则 ma e仅会针对被修改了的文件进行编译,其他的目标文件不会被修改;
- 最后可以依照侬赖性来更新(update)执行文件。
makefile的基本语法与变量
目标(target): 目标文件1 目标文件2
<tab> 命令
下面给个简单的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 main.o haha.o sin_value.o cos_value.o
上面这段代码里有两个target,所以可以使用make main 和make clean以及make clean main (当然都是在makefile的目录下进行的操作)
【注意事项】
- 命令行必须要以
作为开头 - 目标(target)与依赖文件之间需要:进行分隔
- 在makefile中#代表注释
使用变量简化一下上面那段代码如下:
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
$@可以代表当前的target 所以上述代码还可以继续改
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS} #但是这里的main作为target就要显示的写出了
【变量的一些语法要点:】
- 变量与变量内容以[=]隔开,同时两边可以具有空格 ;
- 变量左边不可以有
,例如上面范例的第一行LIBS左边不可以是 ; - 变量与变量内容在[=]两边不能具有[: ];
- 在习惯上,变量最好是以[大写字母]为主;
- 运用变量时,以${变量}或$(变量)使用;
- 在该shell的环境变量可以被套用,例如提到的C F L A G S这个变量;
- 在命令行模式也可以设置变量 。
makefile文件内使用shell环境变量优先级的问题

Tarball的管理与建议
预装软件
- gcc或者cc
- make与autoconfig
- Kernal提供的Library以及相关的Include文件
Tarball安装的步骤
- 获取原始文件:将tarball在/usr/local/src目录下面解压缩
- 获取步骤流程:在新建目录下查看INSTALL以及README等相关文件内容
- 依赖属性软件安装:根据INSTALL和README的内容查看并安装好一些依赖的软件(非必要)
- 建立makefile:使用configure或者config自动检测操作环境,建立Makefile文件
- 编译:用make这个程序,并使用该目录下的Makefile作为它的参数配置文件,来进行make(编译or其他)的操作
- 安装:以make这个程序,并使用Makefile作为参数配置文件,依据install这个目标(target)的指定来安装到正确的路径
写成命令的形式大概是如下的流程
./configure --prefix=/path #建立Makefile文件 --prefix指定未来的安装目录,默认目录是/usr/local
make clean #不是必选,但是还是执行一下,免得有些该清理的文件没清理
make #执行Makefile中的默认工作进行编译行为
make install #根据Makefile中的install选项把编译完成的数据安装到默认目录中
Tarball安装的建议事项
Q1:为什么选择路径usr/local/src而不是路径usr/local来进行解压
主要是图一个便于删除管理。

And Some Tips....
由于Tarball在反安装上具有较高的难度(就是比较麻烦难整的意思)

配置安装目录的方式
./configure --prefix=/path #--prefix指定安装路径
其实Tarball就不怎么用得到。
但是作为Linux用户不应该有点爱折腾的本性吗。
使用patch对源码进行更新
得得得 我又看不进去这一部分了。就很郁闷。
其实我感觉patch用起来还挺麻烦的- - 算了总有一天我会遇到需要这个功能的场景的。


函数库管理
1.动态函数库与静态函数库
静态函数库特点:

动态函数库特点:

2.ldconfig与/etc/ld.so.conf
用来提高函数库的读写性能。

3.程序的动态函数库解析:ldd
ldd [-vdr] [filename]
-v 列出所有信息内容
-d 重新将数据有遗失的链接点显示出来
-r 将ELF有关的错误显示出来
检验软件的正确性
计算机指纹码
- MD5指纹验证机制
- SHA1加密机制
- SHA-256加密算法
md5sum/shalsum [-bct] filename
md5sum/shalsum [--status|--warn] --check filename
应用方式。建立指纹码数据库,并利用脚本自动检测指纹码是否正确。


浙公网安备 33010602011771号