自由(free)软件和授权(proprietary)软件之间的差别在于使用软件的源文件。(由于一些版权软件也提供源文件,所以这不是绝对的。但除非成为自由软件,它的最终用户还是不可以随意改变其代码的。)那意味着自由软件以源代码文档方式公布。这对于初学者来讲是很陌生的,因为自由软件的用户在使用软件之前需要自己动手编译软件。
对于现有的大部分自由软件来讲,都有已经编译好的版本。如果用户比较着急,那么可以直接安装这些已经编译好的二进制文件。而一些自由软件并不是以这种形式公布的,也可能是因为早期版本,还没来得及被编译成二进制文件形式。另外,如果你使用的是其他操作系统,或者其他结构(建筑物?),那么许多软件的已编译版本会不适合你。另外,如果你自己编译软件,你可以只编译自己感兴趣的部分,或者通过添加额外的部分来完成其他功能,以便使这个软件真正适合你。
需求
编译软件,你需要:
- 一台有着可以正常使用的操作系统的计算机
- 一些对于你所使用的操作系统的常识
- 一些磁盘空间
- 一个编译器(通常是c语言的编译器)和一个archiver (tar)
- 一些吃的(有时候,这会花费很长的时间)。真正的黑客吃的是皮萨,而不是曲奇烤饼。
- 一些喝的(理由同上)。真正的黑客喝的是苏打水,而不是咖啡因类饮料。
- 一个技术人员的电话号码——这个技术人员每星期都会重新编译他的系统内核。
- 非常的仔细。对于这一点的需求是非常多的。
编译
原理
要把一个源文件编译成二进制文件,编译版本需要首先完成 (通常是c或c++源文件,这是在自由软件交流中最广泛使用的语言(UNIX下) 。)。一些自由软件是由不需要编译的语言编写的 (例如 Per 或 shell),但是他们仍然会需要进行一些配置工作。
C编译版在逻辑上是由C语言编译器制作的,通常是gcc,这是一个由GNU Project 写出来的免费编译器。变异一个完成的软件包是一个复杂的项目,那需要通过许多不同源文件的连续的编译版制作完成(对于程序员来讲,这比把他的程序分解为不同部分所带来的各种各样麻烦要容易解决得多)。为了使这些对你来说更简单,这些重复的工作将交给一个叫做制作(make)的东东来摆平。
编译的四个步骤:
为了理解编译器是如何工作的(为了解决可能发生的问题),你需要知道相关的步骤。对象被一点一点的转化成由人们可以理解的语言写成的文本文件(即C语言),再成为一种计算机可以理解的语言(可能在某种情况下一些受过非常非常好的训练的人也能读懂)。gcc依次完成以下四个步骤:
- cpp:作为第一步,这时会把指令重新按照纯c结构编排一遍。标准情况下,也就是插入头文件(#include)和定义宏(#define)。在这个步骤结束时,纯C编码被编排好了。
- ccl:这一步是把C语言编码转换为汇编语言编码。产生出来的编码是以目标结构编排的。
- as:这一步从汇编语言中编排出对象编码(或者二进制编码)。在这一步结束后,会产生出一个.o文件。
- ld:链接是最后一步,这时把所有的对象文件(.o)和有关的库文件链接起来,并生成一个可执行文件。
- 一个正确的自由软件发布版的结构总是有着相似的组织形式:
- 一个INSTALL文件,用来描述安装过程。
- 一个README文件,包含关于程序的常用信息(简短描述,作者,获得网址,相关文档,有用链接,等)。如果没有安装文件,说明文档通常会包含关于安装过程的摘要
- 一个COPYING文件,包含关于这个软件的许可或者发布信息的描述。有时会被许可文件代替,但也会包含相同内容。
- 一个CONTRIB或CREDITS文件(也就是鸣谢),列出了该软件的相关人员(参与人员,相关的注释,第三方程序,等)。
- 一个CHANGES文件(有时,是一个NEWS文件),包含最新的改进和排除的错误。
- 一个Makefile文件,标明软件的可编辑部分(这对于make来说是十分必要的文件),如果最初这个文件并不存在,那么它会通过预编辑配置处理。
- 一个configure 或者Imakefile文件,允许你位特殊的系统生成一个新的Makefile文件。
- 一个包含源文件的文件夹,二进制文件通常保存在编译版本的结尾。文件夹名同常为src。
- 一个包含与程序相关文档的文件夹(通常以man或texinfo的格式保存),文件夹名同常为doc。
- 有时还会有一个包含关于软件的特殊数据的文件夹(标准配置文件,处理的数据样例,或者源文件什么的)。
没有评论:
发表评论