什么是开放源码,编译程序和可执行文件

    开放源码:就是程序代码,写给人类看的程序语言,但机器不认识,所以无法执行;
    编译程序:将程序代码转译成为机器看得懂的语言;
    可执行文件:经过编译程序变成二进制程序后,机器看得懂所以可以执行的档案;
什么是函数库
    函数库:是一种可执行代码的二进制格式,类似子程序的角色,可以被调用来执行一段功能函数;又分为动态与静态函数库,因为其没有程序执行入口,所以不能独立运行;
    常用存放函数库的目录: /lib,/usr/lib,/usr/local/lib;
    内核提供的函数库:/lib/modules;
   库的配置文件:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf;
   系统核心库:glibc;
   静态库
       1,文件名一般是libxxx.a;
       2,整个函数库的所有数据都会被整合进目标代码中;
       3,执行程序不再需要外部的函数库支持;
       4,如果静态函数库改变,整个程序必须重新编译;
       5,利用函数库编译成的文件较大;
   动态库
       1,文件名一般是libxxx.so;
       2,编译时不被编译进目标代码,程序执行到相关函数时才调用函数库中相应函数;
       3,动态函数库产生的可执行文件较小;
       4,动态函数库的改变不会影响程序,所以函数库升级方便;
       5,由于函数库没有被整合进程序,所以程序的运行环境必须提供相应的库(不要随意删除和移动);
什么是make与configure
   make:make是一个程序,根据makefile的定义,调用源代码和函数库以及编译器来进行编译;
   configure:检测系统环境,以及该环境是否有软件所需要的其他功能,以及定义如何去编译,然后生成makefile文件;
       configure检测的内容:
           1,是否有合适的编译程序可以编译本软件的代码;
           2,是否已经存在本软件所需要的函数库,或者其他依赖的软件;
           3,操作系统平台是否适合本软件,包括linux的核心版本;
           4,核心的表头定义文件(header include)是否存在;
Tarball软件:就是将软件的所有源代码先以tar打包,然后在压缩的文件,解压后通常有以下内容
   1,源代码文件;
   2,检测程序文件(可能是configure或config等文件名);
   3,软件的简易说明与安装说明(INSTALL或README);
什么是安装软件
   1,将文件解压至指定的目录;
   2,生成相应的数据文件;
为什么要升级软件
   1,需要新的功能,但旧版软件没有;
   2,旧版软件可能有bug或漏洞,需要进行升级;
   3,旧版软件的执行效率低,或不能达到需求;
升级的方法分为两大类
   1,直接以源码通过编译来安装与升级;
   2,直接以编译好的binary program来安装与升级;
源码包的安装流程
    1,将源码包从厂商网页下载下来;
    2,解压源码包;
    3,开始用gcc进行源码的编译(会产生目标文件object files);
    4,然后以gcc进行函数库,主和子程序的链接,以形成主要的二进制文件;
    5,将上面的二进制文件以及相关的配置文件安装到主机中;
   源代码 ==> 编译(二进制) ==> 链接 ==> 运行;
       编译:将源代码转换成计算机可识别的二进制格式;
           常见linux中的编译器:GCC,G++;
       链接:将程序与库的调用入口关联起来;
           动态链接:调用共享库;
           静态链接:将所有依赖的库封装到程序中;
源码安装的优点
   1,有些特性是编译选定的,如果编译未选定此特性,将无法使用;
   2,rpm的版本会落后于源码包,甚至落后很多,源码包升级比rpm更方便,不需要等待rpm制作者升级;
软件的组成部分
   二进制程序:通常的安装目录在/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin;
       程序包含CPU指令和数据;
   库文件:可让其他程序调用,通常的目录/lib,/usr/lib,/usr/local/lib;
   配置文件:通常目录/etc,配置文件一般为纯文本文件或XML文件;
   帮助文件:通常有man,README,INSTALL等;README和INSTALL通常放在/usr/share/doc中;
源码包安装的步骤
   1,取得源码文件:将tarball文件在/usr/local/src目录下解压缩(系统推荐,非必须);
   2,取得步骤流程:进入解压后的目录中,查阅INSTALL和README等文件(重要);
   3,解决依赖关系,安装所需要的软件:根据INSTALL和README的内容检查并安装相应软件;
   4,建立makefile:使用configure或config检测安装环境,并创建Makefile文件;
   5,编译:使用该目录下的Makefile作为make程序的参数配置文件,来进行编译或其他动作;
   6,安装:使用make,并以Makefile这个参数配置文件,依据install这个target的指定来安装到正确的路径;
源码包安装的指令下达方式
    1,./configure:该步骤让用户选定编译特性检查系统环境和相关软件属性,然后生成Makefile;
    2,make clean:make会读取Makefile中关于clean的操作,可删除目标档案,在无法确定源代码中有没有包含上次编译过的目标文件(*.o)使用,以保证是自己的机器所编译的执行档;(可根据实际情况省略)
    3,make:make依据Makefile中的设定的操作进行编译,将源代码编译成可以被执行的可执行文件;
    4,make install:make根据Makefile中关于install的项目,将所编译完成的数据安装到执行目录中;
为了方便管理,通常建议
    1,将源码包数据解压到/usr/local/src中;
    2,安装时,最好安装到/usr/local这个默认路径下;
    3,考虑未来反安装步骤,最好将每个软件单独安装在/usr/local下;
    4,为安装到单独目录的软件的man page加入man path查找路径中;
开始安装源码包
   1,准备开发环境:为程序提供编译环境;
   2,解压下载好的tar包,并查阅INSTALL和README文件:tar -zxvf xxx.tar.gz;
   3,查看configure所支持的参数,并建立Makefile文件:./configure --help;
       --help获取脚本的使用帮助;
       --prefix=/path/to/somewhere     指定软件安装的位置;
       --sysconfdir=/path/to/config_file     指定配置文件的路径;
   4,make clean(可选)
   5,make 编译;
   6,make check    测试编译后的文件是否正确(可选操作,不是所有的Makefile都定义了此功能)
   6,make install    安装;
进一步的操作
   1,修改PATH环境变量,让系统可以识别此程序的二进制文件路径;
       a:在/etc/profile中指定PATH变量;
       b:在/etc/profile.d/目录下建立一个以.sh的文件,然后定义PATH变量;
   2,默认情况下,系统搜索库文件的路径(/lib, /usr/lib); 要增添额外搜寻路径;
       在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中;
       ldconfig:重启后才生效,如果要立即生效,使用此命令;
           -v:显示重新搜寻库的过程;
   3,头文件:输出给系统,头文件中包含了自己所提供的函数属性,用于被其他二次开发所使用的文件;
           默认目录:/usr/include;
           增添头文件搜寻路径,使用链接进行
               a:ln -s /usr/local/name/include/* /usr/include;
               b:ln -s /usr/local/name/include /usr/include/name;
   4,man文件路径:默认安装在--prefix指定的目录下的man目录中,而系统是在/usr/share/man中查找的;
               a:vim /etc/man.config;
                       添加:MANPATH /path/to/file:指定查找man文件的路径;
               b:man -M /PATH/TO/MAN_DIR COMMAND;
如何将函数库加入到内存中:
如果将常用的动态函数库预先加载到内存中,可以增加动态函数库的读取速度;
   1,在/etc/ld.do.conf中新增一行写入想要读入缓存中的动态函数库所在的目录,例如:/usr/lib/mysql;
   2,使用ldconfig将/etc/ld.do.conf的资料读入内存中;
   3,同时也将数据记录一份在/etc/ld.so.cache文件中;
   ldconfig还可以用于判断动态函数库的链接信息
       ldconfig [-f conf] [-C cache]
       ldconfig [-p]
          -f conf:conf指某个文件名,即使用conf作为libarary函数库的取得路径,而不是以/etc/ld.so.conf为默认值
         -C cache:cache指某个文件名,即使用cache作为快取暂存的函数库资料,而不是以/etc/ld.so.cache为默认值
         -p:列出目前所有函数库资料内容(在/etc/ld.so.cache内的资料)
程序的动态函数库解析:ldd
    用于判断某个可执行的二进制文件含有什么动态函数库;
    ldd [-vdr] [filename]:查看命令与库的依赖关系;
         -v:列出所有内容;
         -d:重新将资料有意识到link点显示出来;
         -r:将ELF有关的错误内容显示出来;
         通常查询出来的第一个结果是程序的访问入口,不是依赖的库文件;
检查下载后软件包的正确性
   md5sum/sha1sum [-bvt] filename          
   md5sum/sha1sum [--status|--warn] --check filename

       -b:使用binary的读档方式,默认为windows/DOS档案型态的读取方式

       -c:检验文件指纹

       -t:以文件方式来读取指纹

   可以用这两条命令为系统关键文件的指纹记录下来,用于保证系统的安全,比如/etc/passwd和/etc/shadow;

示例:源码安装httpd server(apache server)

   下载所需要的软件包:

       httpd:

       apr:

       apr-util:

   操作系统:CentOS6.4,默认安装的软件包:basic默认;

   准备工作:将下载的源码包下载到/usr/src目录下,并解压:tar -zxvf xxxx.tar.gz;

   安装apr

       1,cd /usr/src/apr-1.5.1

       2,./configure --prefix=/usr/local/apr

       3,make

       4,make install

   安装apr-util

       1,cd /usr/src/apr-util-1.5.3

       2,./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/

       3,make

       4,make install

   安装httpd(apache)

       1,cd /usr/src/httpd-2.4.9

       2,./configure --prefix=/usr/local/httpd-2.4.9 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

       注:这里只是为了演示源码包的安装,如果需要定制httpd的功能,使用./configure --help,查阅帮助信息;

       3,make

       4,make install

   将httpd的bin目录加入到PATH中

       1,vim /etc/profile.d/httpd.sh

       2,输入"export PATH=$PATH:/usr/local/httpd-2.4.9/bin",保存退出;

       3,source /etc/profile

   启动apache:apachectl start

   在浏览器中输入服务器的IP地址,如果看到“It works!“表示安装成功!

   停止apache:apachectl stop

删除apache:将/usr/local/httpd-2.4.9目录删除即可;

声明:本文为学习笔记,内容参考多方资料,如涉及版权问题,请告知本人,谢谢!