感谢支持
我们一直在努力

Linux基础教程:从源码安装软件

为什么要从源码安装软件

    在什么情况之下,我们需要从源代码安装软件呢?我想不外乎这些情形:一种情况是软件放出了新的版本,而所用的发行版并没有及时跟进,这时候,想要尝鲜的话,就非得靠自己不可;另一种情形是不管是软件的开发者,还是现用的系统都没有提供可直接使用的二进制包,而自己又非要使用该软件,那么也需亲自出马才行;当然,还有其他的情形。总而言之,学会从源代码安装软件是一项非常重要的技能。

什么是make 与 configure

    make 是一支程序,当执行make 时,make 会在当前目录下寻找 makefile 这个文本文件。 makefile 中定义了源码是如何编译的详细信息,如何调用 gcc对源代码进行编译生成目标文件,如何链接生成可执行文件。

    makefile 是如何生成的呢? 通常,软件开发商都会提供一个检测程序来检测用户的操作系统环境,该程序检测完毕之后,就会主动的建立这个makefile 。

准备工作

    那么,要如何才能从源代码安装软件呢?首先,你必须要做好为编译源代码所需的准备工作。这包括两个方面:

  1. 编译工具:要将源代码编译成可执行的二进制文件,编译工具必不可少: gcc , g++ , make , autoconfig 等等。在CentOS系列中,可以通过 yum -y groupinstall “Development Tools” 来安装。在 Ubuntu 中,可以从终端中执行 sudo apt-get install build-essential 指令来安装基本的编译工具。根据所编译程序的实际情况,你也可能需要安装其他一些工具。

  2. 编译依赖:除了安装基本的编译工具之外,为了顺利编译源代码,我们也要把该程序所需要的依赖安装好。包含系统提供的库函数, 以及第三方软件的依赖包。在CentOS系列中,可以通过 yum -y install  xxxx   xxxx-devel 来安装相应的依赖包。Ubuntu 系统可以通过 sudo apt-get build-dep 命令后跟包名的方式来准备所需的依赖。一般情况下,如果 configure 或者 make 报错,其报错信息都明确的指出缺少依赖,只需按要求做即可。或者把错误信息复制到 google 一下,即可愉快的解决。

 

源码安装3部曲: ./configure ; make && make install

    在编译源代码之前,你一定把软件的源码包下载到了自己的硬盘上吧。一般而言,程序源码包经常被打包成 .tar.gz 和 .tar.bz2 这两种格式。前者可用 tar zxvf *.tar.gz 来解包,后者则用 tar jxvf *.tar.bz2。通常情况建议解压到 /usr/local/src 目录: # tar xf *.tar.gz -C /usr/local/src

    通常,在解包后,我们应该阅读程序附带的相关说明文件,如 README(自述文件)、INSTALL(安装文件)等,以便了解程序的编译介绍。这一步超级重要!!!

当所有的事情都准备妥当了后,那么让我们来进行源代码编译的三部曲吧。

  1. 配置,建立makefile文件:这是编译源代码的第一步,通过 ./configure 命令完成。执行此步以便为编译源代码作准备。常用的选项有 --prefix=PREFIX,用以指定程序的安装位置。更多的选项可通过 –help 查询。也有某些程序无需执行此步。

  2. 编译:一旦配置通过,可即刻使用 make 指令根据makefile的定义,调用 gcc 来执行源代码的编译过程。视软件的具体情况而定,编译所需的时间也各有差异,我们所要做的就是耐心等候和静观其变。此步虽然仅下简单的指令,但有时候所遇到的问题却十分复杂。较常碰到的情形是程序编译到中途却无法圆满结束。此时,需要根据出错提示分析以便找到应对之策。需要执行 make clean , 然后再重新执行 make 指令。

  3. 安装:如果编译没有问题,那么执行 make install 就可以将程序安装到系统中了。

需要注意的是:上面的步骤必须一步一步的进行,只要其中的一个步骤无法成功,那么后续就完全没有办法再进行。

 

管理:目录规划,卸载,升级

  • 源码通常解压到 /usr/local/src 目录

  • 安装时最好安装在 /usr/local 目录

  • 将 软件的 man page 加入 man path 中, 编辑 /etc/man.config ,增加 MANPATH  项。

  • 把软件的 bin 目录加入到 PATH 环境变量, 编辑 /etc/profile.d/xxxx.sh, 增加 export PATH=$PATH:/usr/local/xxx/bin

若是觉得所编译的软件不够适用想要删除,又如何做呢?我们只需转到编译源代码的目录,执行 sudo make uninstall 命令。

相关阅读:C++静态库与动态库  http://www.linuxidc.com/Linux/2015-04/115811.htm 

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2015-04/115812p2.htm

ldconfig 与 /etc/ld.so.conf

 通过上面的讲解,我们可以知道,动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入内存。如果从硬盘上读取,将会影响程序加载运行的效率,我们可以预先把 动态库 加载到内存中 cache,这样以提高效率。

    如何将动态库加载到高速缓存 cache 中呢?

  1. 编辑 /etc/ld.so.conf , 添加需要读入 cache 的动态库目录

  2. 利用ldconfig 可执行文件将 /etc/ld.so.conf 数据读入缓存中

  3. 同时,以上命令也将数据记录在 /etc/ld.so.cache 中 

 

    ldconfig 是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命

令 ldconfig。 ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件 

/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入

程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.

    linux下的共享库机制采用了类似于高速缓存的机制,将库信息保存在/etc/ld.so.cache里边。

ldconfig命令的作用是
    ldconfig creates the necessary links and cache to the most recent shared libraries found in the directories specified on the command line, in the file /etc/ld.so.conf, and in the trusted directories (/lib and /usr/lib). The cache is used by the run-time linker, ld.so or ld-linux.so. ldconfig checks the header and filenames of the libraries it encounters when determining which versions should have their links updated.

ldconfig命令需要注意的问题

1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到

2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到

比 如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就 需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程 序运行时被找到。

3. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变 量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时 候使用。

4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。

5. 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-04/115812.htm

赞(0) 打赏
转载请注明出处:服务器评测 » Linux基础教程:从源码安装软件
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏