源码方式安装软件

强颜欢笑 提交于 2020-03-11 18:58:23

 

源码包编译安装

=======

Created 星期一 23 十月 2017

 

 

一、使用make编译软件前需要安装的包

GCC为GNU编译器套件(GNU Compiler Collection),

yum -y install cpp                  ###cpp为c++库

yum -y install binutils              ###二进制工具集,用于创建C库文件和创建静态库

yum -y install glibc                 ###GNU发布的libc库,即C运行库,其他库都依赖与glibc库

yum -y install glibc-kernheaders     

yum -y install glibc-common

yum -y install glibc-devel

yum -y install gcc                   ### GNU编译器套件,不仅可处理c语言,也可处理多种语言

yum -y install make                 ###可能系统不一定自带,最好Yum安装以下

二、静态链接库与动态链接库

题外话:函数与方法的区别:函数是大家的函数,直接调用可实现相应功能,无需关心数据结构算法以及自己进行编写,即可供大家使用的。方法是类的方法。静态库和动态库就是由大量的函数组成。

库分为静态链接库和动态链接库(共享库)。

2.1、静态函数库

    这类库的名字一般是 libxxx.a ,扩展名为.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为 如果静态函数库改变了,那么你的程序必须重新编译 。

2.2、动态函数库

    这类库的名字一般是 libxxx.so,扩展名为.so ;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。 动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

2.3、动态链接库管理命令

/etc/ld.so.conf    是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从 /usr/lib  /lib 中读取的 ,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig.此执行程序存放在/sbin目录下.ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,

动态库添加新路径    Vim /etc/ld.so.conf

      

    添加完整路径          #####直接在/etc/ld.so.conf下面加一行/usr/local/mysql/lib

生效    ldconfig

注意事项    1、/lib和/usr/lib不需要添加在文件中,默认已经被加载了

    2、添加完整路径比如直接在/etc/ld.so.conf下面加一行/usr/local/mysql/lib

    3、ldconfig    ###搜索出可共享的动态链接库,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。

 

 

2.4、关于动态库报错处理

一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:

tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

 

原因一般有两个:

    一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可.

      

      另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.

      

    (1)如果共享库文件安装到了/lib或/usr/lib目录下

      

    ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.

      

    (2)如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:

      

    # cat /etc/ld.so.conf

    include ld.so.conf.d/*.conf

    # echo "/usr/local/lib" >> /etc/ld.so.conf

    # ldconfig

      

    (3)如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下,  但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库.

      

    LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:

      

    export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH    

      

    一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用.

三、源码包编译和安装

3.1、源码包准备

(1)源码包发送到linux系统中

(2)解压后生成目标文件夹。建议mv到对应用户的家目录下,作为软件安装包备份。

(3)cd进入软件安装包的目录中。

3.2、./configure

预编译,用于设置编译前的参数,比如安装在哪个目录,添加什么功能组件,关闭什么功能组件,添加第三方库的路径等等。可通过-help查看configure参数选项

--prefix(必选)         例子:./configure –prefix=/opt/ffmpeg

只有Prefix参数是必选的,且安装目录建议选择在/opt目录下,原因是:

很多的选项,个人认为,你可以忽略其他的一切,但要把—prefix加上。这里以安装supersparrow-0.0.0为例,我们打算把它安装到目录 /usr/local/supersparrow,于是在supersparrow-0.0.0目录执行带选项的脚本./configure --prefix=/usr/local/supersparrow,执行成功后再编译、安装(make,make install);安装完成将自动生成目录supersparrow,而且该软件所有的文件都被复制到这个目录。为什么要指定这个安装目录?是为了以后的维护方便,如果没有用这个选项,安装过程结束后,该软件所需的软件被复制到不同的系统目录下,很难弄清楚到底复制了那些文件、都复制到哪里去了—基本上是一塌糊涂。

用了—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。

运行configure脚本,这样可生产出符合GNU规范的Makefile文件。Makefile文件指导make工具如何去自动化编译和链接。

makefile带来的好处就是——"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

3.3、make

编译概念:解释当前的Makefile,完成其中指定的功能(编译程序和链接程序)。将高级语言程序翻译成目标程序,目标程序是计算机可识别的二进制文件。类似于windows的exe文件,输入命令即可直接执行。

Make完成后,没有明显的报错且没有使得编译进程终端,即表示编译成功。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。

3.4、make install

编译出来的二进制文件,库,配置文件等等放到相应目录下。比如放到指定的/opt目录下。

3.5、make clean

清除编译产生的可执行文件及目标文件(object file,*.o)。

四、环境变量

4.1、介绍

环境变量是一个命令仓库,bash会在这里寻找。环境变量中寻找命令只会从当前目录下寻找,不会遍历当前目录的子目录。

命令执行寻找顺序:

    一、如果是绝对/相对路径,那么命令直接执行。比如直接执行/bin/ls

    二、是否为alias别名

三、判断内部命令还是外部命令

注:

通常,软件通过源码包方式安装后,不会自动设置环境变量。那么在运行软件时,需要进入软件的目录再执行,比较麻烦;而设置环境变量后,在任何目录下,输入命令即可运行软件。还有的情况是软件有文件与文件之间的调用,如果不设置环境变量,软件运行可能会报错。所以环境变量非常重要。

查看$PATH环境变量命令:

[root@client ~]# echo $PATH

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin    

命令在以上显示的目录中寻找。

4.2、关于profile和bashrc

前提:Bash shell是sh shell的增强版。

CentOS下有如下四个文件:

/etc/profile

/etc/bashrc

~/.bash_profile

~/.bashrc

交互shell与非交互shell区别:

    输入命令,执行一次,返回结果,这个就是交互shell;

    运行一个脚本,直到end,shell结束,这个就是非交互shell;

在系统启动后:

(1)用户第一次通过终端ssh连接主机或者"su -"或者通过GNOME登陆输入用户名和密码,会依次执行如下文件:

/etc/profile   /etc/profile.d/*.sh  /etc/bashrc    ~/.bash_profile   ~/.bashrc

这个就叫交互性login shell

(2)当用户"su"到一个新用户,或者在GNOME界面新开一个窗口,会依次执行如下文件:

/etc/bashrc   ~/.bashrc

这个就叫交互性non-login shell

区分有什么用呢?

    实际上,修改环境变量,在profile和bashrc上设置都是OK的。由于bashrc只要每开一个新窗口就执行一次等的这种特性,最适合用于用户自定义环境。比如bashrc里写echo $PATH  。那么每次切换到特定用户都会显示出特定用户的环境变量,或者存放别名参数等。而profile更适合放置比较重要的参数,比如环境变量。

4.3、环境变量修改

4.3.1、编辑环境变量

Vim /etc/profile            ###不建议使用,存在安全问题

export PATH="/opt/mycat/bin:$PATH"

export PATH="/opt/zookeeper-3.4.9/bin:$PATH"         

####环境变量格式export PATH="????????:$PATH"     ????????表示路径

vim ~/.bash_profile         ###推荐使用

export PATH="/opt/mycat/bin:$PATH"

export PATH="/opt/zookeeper-3.4.9/bin:$PATH"         

####环境变量格式export PATH="????????:$PATH"     ????????表示路径

4.3.2、修改后生效

source /etc/profile   或者source ~/.bash_profile

source命令也称为"点命令" ,使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。

/bin/bash作为初始化文件,里面有代码调用bashrc这个文件,所以bashrc也作为初始化文件。当使用source命令时,将初始化文件重新执行以下。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!