编程领悟

在使用linux编程时,能够很清晰的了解到程序整个的编译流程,由于linux是开放源代码的,因此可以清晰的了解到如何将开放源代码的程序设计、加入函数库的原理、通过编译而成为可以执行的二进制程序,最后该执行文件可以被我们所使用的一连串过程。最传统的软件安装,自然就是通过源代码编译而来,而linux提供了另外一种更加快捷的方式来实现软件的安装。

linux上面的软件几乎都是经过GPL授权,所以每个软件几乎均提供源代码,并且可以自行修改程序代码,以符合个人的要求。

在linux中真正识别的可执行文件其实是二进制程序。例子:用c语言来编写程序,用gcc这个编译器来编译,就可以制作可以执行的二进制程序。当然在编译的过程中会产生所谓的目标文件,这些文件是以.o的扩展名样式存在额,又是需要利用其它软件提供的函数功能,所以就必须在编译的过程中,将该函数库架进去,如此一来,编译器就可以将所有的程序代码与函数 库做一个链接(link)以产生正确的执行文件。

函数库分为动态和静态函数库,在编译的过程中,加入函数库的相关设置。事实上,Linux内核提供了很多与内核 相关的而函数库与外部参数,这些内核功能在设计硬件的驱动程序的时候是相当游泳的信息。

执行make,make会在当前的目录下查找Make file这个文本文件,而Makefile里面则记录了源代码如何编译的详细信息。make会自动地判别源代码是偶变动了,而自动更新执行文件。

一般来说:检测程序会检测的内容大约有下面这些:

1.是否有合适的编译器可以编译本软件的程序代码

2.是否已经存在本软件所需要的函数库,或其它需要的依赖软件

3.操作系统平台是否适合本软件,包括linux的内核版本

4.内核的头文件是否存在。

但是每次都下载源文件来安装软件这样的方式是实在是太麻烦了,纯文本文件在网络上其实是很浪费带宽的一种文件格式。如果能够将这些源代码通过文件的打包与压缩技术来将文件的数量与容量减少,不但让用户容易下载,软件开发商的网站带宽也能够节省很多很多。

例如Tarball :就是将软禁的所有源代码先以tar打包,然后再以压缩技术来压缩,冗长最常见的就是以gzip 来压缩,因为利用了tar与gzip的功能,所以Tarball文件一般的扩展名就会写成.tgz。因此Tarball是一个软件包,将它解压后,里面的文件有:

1.源文件

2.检测程序文件(可能是configure或config)

3.本软件的建议说明

 

因此linux只能装软件的方式有两种:

1.直接以源代码的方式通过编译来安装

2.直接以编译好的二进制文件来安装与升级

由Tarball是如何安装的呢?基本流程是这样的:
1.将Tarball由厂商的网站下载;

2.将Tarbal揭开,产生很多的源代码文件;

3.开始以gcc进行源代码的编译(会产生目标文件object files)

4.然后 以gcc进行函数库、主、子程序的链接,以形成主要的二进制文件

5.将上述的二进制文件以及先骨干的而配置文件安装到自己主机上面

Tarball要在/usr/local/src里面解压缩。基本上,再默认的情况下,原本的linux发行版发布安装的软件大多是在/usr里面,而用户自行安装的软件则建议放置在/usr/local里面,这是考虑到管理用户所安装软件的便利性。

通常建议大家将自己安装的软件放置在/usr/local下面,至于源代码则建议放置在/usr/local/src下面

软件大致安装目录有下面几个:

1./etc/httpd

2./usr/lib

3./usr/bin

4./usr/share/man

单一软件的文件都在同一个目录之下,那么要删除软件就会很容易。

通常我们安装软件的目录是不在PATH中的,因此如果想要启动这个软件,就要将这个/usr/local/bin/****加入到PATH中去,另外,那个/usr/local/apace/man也需要加入man page查找的路径中去。

1.最好将Tarball的原始数据解压缩到/usr/loal/src当中

2.安装时,最好安装到/usr/local这个默认路径下

3.考虑未来的反安装步骤,最好可以将每个软件单独安装在/usr/lcoal里面

4.为安装到单独目录的软件的man page加入man path 查找

所谓的(更新源代码)常常是只更改部分文件的小部分内容而已。因此旧版本到新版本没有修改过的文件就不要理它,仅处理自定义过的文件部分即可。

diff 可以将两个文件的差异性列出来。可以通过diff对比出新旧版本之间的文字差异,然后再以相关的命令来将旧版的文件更新。

patch 很多的软件的开发商再更新了源代码之后,几乎都会发布所谓的patch文件,也就是直接将源代码update的一个方式。

很多软件之间都会互相使用彼此提供的函数库来使用其特殊的功能。

函数库依照是否被编译到程序内部而分为动态与静态函数库。

静态函数库的扩展名是***.a,这类函数库在编译的时候会直接整合到执行程序中,所以利用静态函数库编译成的文件会比较大一些。这类函数库最大的优点是,编译成功的可执行文件可以独立运行,而不需要向外部要求读取函数库的内容。

动态函数库***.so,动态函数库与静态函数库编译操作差异挺大的。与静态函数库被整个整和到程序中不同的是,动态函数库在编译的时候,在陈旭里面只有一个指针的位置。也就是说,动态函数库的内容并没有被整合到执行文件中,而是当执行文件要使用到函数库的功能时,程序才会读取函数库来使用,由于执行文件中仅具有指向动态函数库所在的指针时,程序会主动去某个路径下读取,所以动态函数库可不能随意移动和删除,会影响很多软件的运行。虽然这类的执行软件无法独立运行,然而由于时具有指向的功能,所以,当函数库升级后,执行文本根本不需要进行重新编译的操作,因为执行文件会直接指向新的函数库文件。

绝大多数的函数库都放在/lib64和/llib目录中,此外,Linux系统里面很多的函数库其实内核就提供了,那么内核的函数库放在哪里呢,放在/lib/modules里面,不同版本的内核提供的函数库差异性hi是挺大的。

如果我们将常用的动态函数库先加载到内存中,如此一来,当软件要使用动态函数库时,就不需要从头由硬盘里面独处,这样不就可以提高动态函数库的读取速度。

如何判断某个可执行的二进制文件含有什么动态函数库。利用ldd就可以了。

RPM和YUM称之为软件管理器,厂商先在它们的系统上编译好了我们用的所需要的软件,然后将这个编译好的可执行软件直接发给用户来安装。

posted on 2019-03-07 15:04  xiegangqingnian  阅读(120)  评论(0编辑  收藏  举报

导航