【转】./configure && make && make install详解

Linux中利用源码包安装软件最重要的就是要仔细阅读安装包当中的README  INSTALL两个说明文件,这两个文件会清楚的告诉你如何能够正确的完成这个软件的安装!
         咱们都知道源码包安装分为这么几个阶段,
一、  ./configure:“configure”会在你的系统上测试存在的特性  Make:编译程序。
五、 cd:进入到这个源码包。
 
如今ls一下mrtg这个目录下多了一个蓝色字体的httpd-2.2.11这个目录,这个目录就是咱们刚解压开的,而后cd进入到这个目录下面!若是不进入到这个目录下而是直接 ./configure则会出现下图的提示!
三、bug!)而后来创建Makefile文件来完成make!
“configure”脚本有大量的命令行选项,对不一样的软件包来讲,这些选项可能会有变化,可是许多基本的选项是不会改变的。而咱们用的最多的也就是下面这条命令:
./configure --prefix=/软件要安装的路径
可是咱们也能够直接./configure而不指定路径,一般经过从源码包编译安装的软件默认路径都是/usr/local/,若是./configure不成功而直接去make的话,就会出现下图的错误:
当咱们解决完./configure的错误,而后从新./configure成功后,咱们就能够编译程序了!
再说几个能关系到可否编译成功的文件:/etc/ld.so.conf、ldconfig
首先说一下/etc/ld.so.conf,这个文件中记录的编译时使用的动态连接库的路径,默认状况下编译器只会使用/lib和/usr/lib这两个 目录下的库文件,若是你安装了其余的库,那么安装完成后就在/etc/ld.so.conf把这个库文件中的绝对路径写进去就OK了。
再来看看ldconfig是个什么东西吧:
他是一个程序,它的做用就是将/etc/ld.so.conf中的路径缓存到/etc/ld.so.cache中,所以在安装完一些库文件或者修改 ld.so.conf增长新的路径后须要运行一下/sbin/ldconfig使全部的库文件都缓存都ld.so.cache中,若是没有运行/sbin /ldconfig,即便库文件就在/etc/ld.so.conf中,也是不会被使用的,结果在编译的过程当中一样报错缺乏XXX库!
四、Make:编译程序。
在编译的时候, gcc个版本之间存在着差别,因此有时候用不一样版本的gcc去编译,有的版本能编译成功,有的就编译失败,这样的错误只是版本问题。
另外在 make的时候会出现的另外一个错就是比较难办的,遇到这样的问题就只能凭经验查找缘由,好比说某个头文件没有找到,这个时候就要顺着出错的位置一行一行的往上找,好比显示XXXXXX.h………no such file or directory,说明缺乏头文件,或者找到你以为有价值的错误信息去搜索引擎里搜索,从这里可能会找到对你有用的信息,最重要的就是在安装以前仔细的去看README、INSTALL文件,这两个文件里会告诉你程序应该怎样去安装,须要什么依赖文件等等。
有的时候在编译时不知道是否编译成功,而在没有编译成功就去 make  install确定会出错,这样就增长了问题的复杂性,俗话说的好“道高一尺魔高一丈”,这样咱们能够在make结束的时候经过一条命令来检查是否成功编译:echo  $?
输入这条命令回车后,输出的结果是 0,那么就说明成功编译,不然就是出错了,echo  $?表示检查上一条命令的退出状态,程序正常退出返回0!
五、<span times="" new="" roman'"="" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">  Make install:安装文件!
它也从 Makefile中读取指令,而后安装到指定的位置。
看到上图输出 0以后咱们就能够make  install来安装了,运行完以后输入echo  $?检查看看是否有错误,只要输出结果为0,那就说明咱们的安装成功,咱们能够测试一下,把Apache的服务起来/usr/local/apache2/bin/apachectl start,由于Apache的端口是80因此咱们netstat -lan | grep 80来看看80端口处于监听状态不:
而后再 IE里输入服务器的IP地址http://10.10.234.203/
成功了,说明咱们的安装没问题 !
其实 ./configure、make、make  install这三个命令,咱们能够用&&来把命令链接起来执行,表示当前一条命令正常结束后,后面的命令才会执行,这个办法很好,既节省时间,又能够防止发生错误。例:
./configure  &&  make  &&  make  install
 

正常的编译安装/卸载:

源码的安装通常由3个步骤组成:配置(configure)、编译(make)、安装(make install)。
 
configure文件是一个可执行的脚本文件,它有不少选项,在待安装的源码目录下使用命令./configure –help能够输出详细的选项列表。
 
其中--prefix选项是配置安装目录,若是不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。
 
若是配置了--prefix,如:
$ ./configure --prefix=/usr/local/test
 
安装后的全部资源文件都会被放在/usr/local/test目录中,不会分散到其余目录。
 
使用--prefix选项的另外一个好处是方便卸载软件或移植软件;当某个安装的软件再也不须要时,只须简单的删除该安装目录,就能够把软件卸载得干干净净;而移植软件只需拷贝整个目录到另一个机器便可(相同的操做系统下)。
 
固然要卸载程序,也能够在原来的make目录下用一次make uninstall,但前提是Makefile文件有uninstall命令(nodejs的源码包里有uninstall命令,测试版本v0.10.35)。
 

关于卸载:

若是没有配置--prefix选项,源码包也没有提供make uninstall,则能够经过如下方式能够完整卸载:
 
找一个临时目录从新安装一遍,如:
$ ./configure --prefix=/tmp/to_remove && make install
 
而后遍历/tmp/to_remove的文件,删除对应安装位置的文件便可(由于/tmp/to_remove里的目录结构就是没有配置--prefix选项时的目录结构)。
 
 
 
若是有rpm包的话尽可能避免使用源码包安装,linux的rpm包管理工具很强大,方便管理。
若是必需要用源码包安装,请在安装的时候指定--prefix安装目录,另外安装的时候请使用
make >& LOG_make &
make install >& LOG_install &
用于保存安装信息日志,这样须要卸载的时候方便查看哪些文件安装在了系统目录中,例如/usr/lib下的库文件。

常见的反安装target有: make uninstall/distclean/veryclean 等等。若是没有,
不是每一个源代码包都提供make uninstall的,这不是个通用方法
 
若是安装的时候指定了prefix,直接删除就好。若是没有,而且源代码没有提供make uninstall/distclean/veryclean的功能,我通常这样作:
找一个临时目录从新安装一遍。好比
./configure --prefix=/tmp/to_remove && make install
而后遍历/tmp/to_remove里的文件,把你原来安装位置的文件都删除。

这样的坏处是有些文件夹还可能删除不了(分不清是系统的仍是安装上的)
  Linux环境下的软件安装,并非一件容易的事情;若是经过源代码编译后在安装,固然事情就更为复杂一些;如今安装各类软件的教程都很是广泛;但万变不 离其中,对基础知识的扎实掌握,安装各类软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。
    与一些技巧相比,Configure显得基础一些,固然使用和学习起来就显得枯燥乏味一些,固然要成为高手,对基础的熟悉不能超越哦。
为此我转载了一篇关于Configure选项配置的详细介绍。供你们参考
'configure'脚本有大量的命令行选项.对不一样的软件包来讲,这些选项可能会有变化,可是许多基本的选 项是不会改变的.带上'--help'选项执行'configure'脚本能够看到可用的全部选项.尽管许多选项是不多用到的,可是当你为了特殊的需求而 configure一个包时,知道他们的存在是颇有益处的.下面对每个选项进行简略的介绍:
--cache-file=FILE
'configure'会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会 存储在一个cache file里.当configure一个每一个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.
--help
输出帮助信息.即便是有经验的用户也偶尔须要使用使用'--help'选项,由于一个复杂的项目会包含附加的选项.例如,GCC包里的'configure'脚本就包含了容许你控制是否生成和在GCC中使用GNU汇编器的选项.
--no-create
'configure'中的一个主要函数会制做输出文件.此选项阻止'configure'生成这个文件.你能够认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.
--quiet
--silent
当'configure'进行他的测试时,会输出简要的信息来告诉用户正在做什么.这样做是由于 'configure'可能会比较慢,没有这种输出的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两 句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)
--version
打印用来产生'configure'脚本的Autoconf的版本号.
--prefix=PEWFIX
'--prefix'是最经常使用的选项.制做出的'Makefile'会查看随此选项传递的参数,当一个包在安装 时能够完全的从新安置他的结构独立部分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share":
$ ./configure --prefix=/opt/gnu
--exec-prefix=EPREFIX
与'--prefix'选项相似,可是他是用来设置结构倚赖的文件的安装位置.编译好的'emacs'二进制文件就是这样一个问件.若是没有设置这个选项的话,默认使用的选项值将被设为和'--prefix'选项值同样.
--bindir=DIR
指定二进制文件的安装位置.这里的二进制文件定义为能够被用户直接执行的程序.
--sbindir=DIR
指定超级二进制文件的安装位置.这是一些一般只能由超级用户执行的程序.
--libexecdir=DIR
指定可执行支持文件的安装位置.与二进制文件相反,这些文件历来不直接由用户执行,可是能够被上面提到的二进制文件所执行.
--datadir=DIR
指定通用数据文件的安装位置.
--sysconfdir=DIR
指定在单个机器上使用的只读数据的安装位置.
--sharedstatedir=DIR
指定能够在多个机器上共享的可写数据的安装位置.
--localstatedir=DIR
指定只能单机使用的可写数据的安装位置.
--libdir=DIR
指定库文件的安装位置.
--includedir=DIR
指定C头文件的安装位置.其余语言如C++的头文件也可使用此选项.
--oldincludedir=DIR
指定为除GCC外编译器安装的C头文件的安装位置.
--infodir=DIR
指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式.
--mandir=DIR
指定手册页的安装位置.
--srcdir=DIR
这个选项对安装没有做用.他会告诉'configure'源码的位置.通常来讲不用指定此选项,由于'configure'脚本通常和源码文件在同一个目录下.
--program-prefix=PREFIX
指定将被加到所安装程序的名字上的前缀.例如,使用'--program-prefix=g'来 configure一个名为'tar'的程序将会使安装的程序被命名为'gtar'.当和其余的安装选项一块儿使用时,这个选项只有当他被 `Makefile.in'文件使用时才会工做.
--program-suffix=SUFFIX
指定将被加到所安装程序的名字上的后缀.
--program-transform-name=PROGRAM
这里的PROGRAM是一个sed脚本.当一个程序被安装时,他的名字将通过`sed -e PROGRAM'来产生安装的名字.
--build=BUILD
指定软件包安装的系统平台.若是没有指定,默认值将是'--host'选项的值.
--host=HOST
指定软件运行的系统平台.若是没有指定,将会运行`config.guess'来检测.
--target=GARGET
指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起做用.若是没有指定,默认将使用'--host'选项的值.
--disable-FEATURE
一些软件包能够选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置.若是默认是提供这些特性,可使用'--disable-FEATURE'来禁用它,这里'FEATURE'是特性的名字.例如:
$ ./configure --disable-gui
-enable-FEATURE[=ARG]
相反的,一些软件包可能提供了一些默认被禁止的特性,可使用'--enable-FEATURE'来起用它.这里'FEATURE'是特性的名字.一个特性可能会接受一个可选的参数.例如:
$ ./configure --enable-buffers=128
`--enable-FEATURE=no'与上面提到的'--disable-FEATURE'是同义的.
--with-PACKAGE[=ARG]
在自由软件社区里,有使用已有软件包和库的优秀传统.当用'configure'来配置一个源码树时,能够提供 其余已经安装的软件包的信息.例如,倚赖于Tcl和Tk的BLT器件工具包.要配置BLT,可能须要给'configure'提供一些关于咱们把Tcl和 Tk装的何处的信息:
$ ./configure --with-tcl=/usr/local --with-tk=/usr/local
'--with-PACKAGE=no'与下面将提到的'--without-PACKAGE'是同义的.
--without-PACKAGE
有时候你可能不想让你的软件包与系统已有的软件包交互.例如,你可能不想让你的新编译器使用GNU ld.经过使用这个选项能够作到这一点:
$ ./configure --without-gnu-ld
--x-includes=DIR
这个选项是'--with-PACKAGE'选项的一个特例.在Autoconf最初被开发出来时,流行使用 'configure'来做为Imake的一个变通方法来制做运行于X的软件.'--x-includes'选项提供了向'configure'脚本指明 包含X11头文件的目录的方法.
--x-libraries=DIR
相似的,'--x-libraries'选项提供了向'configure'脚本指明包含X11库的目录的方法.
在源码树中运行'configure'是没必要要的同时也是很差的.一个由'configure'产生的良好的 'Makefile'能够构筑源码属于另外一棵树的软件包.在一个独立于源码的树中构筑派生的文件的好处是很明显的:派生的文件,如目标文件,会凌乱的散布 于源码树.这也使在另外一个不一样的系统或用不一样的配置选项构筑一样的目标文件很是困难.建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree).这里有一个很接近的例子,是使用这种方法来构筑GNU malloc包:
$ gtar zxf mmalloc-1.0.tar.gz
$ mkdir build && cd build
$ ../mmalloc-1.0/configure
creating cache ./config.cache
checking for gcc... gcc
checking whether the C compiler (gcc ) works... yes
checking whether the C compiler (gcc ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for a BSD compatible install... /usr/bin/install -c
checking host system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu
checking for ar... ar
checking for ranlib... ranlib
checking how to run the C preprocessor... gcc -E
checking for unistd.h... yes
checking for getpagesize... yes
checking for working mmap... yes
checking for limits.h... yes
checking for stddef.h... yes
updating cache ../config.cache
creating ./config.status
这样这棵构筑树就被配置了,下面能够继续构筑和安装这个包到默认的位置'/usr/local':
$ make all && make install
 
补充:configure &&make&&make install 解释
configure 配置Makefile中的参数,好比编译器,库路径…………
make 它从Makefile中读取指令,编译源码
make install 编译后的处理,好比把文件移动到指定目录
 

第一步:./configure

  • 首先检查机器的一些配置和环境,系统的相关依赖。若是缺乏相关依赖,脚本会中止执行,软件安装失败
  • 根据以前检查环境和依赖的结果,生产Makefile文件(main job)

第二步:make

  • make是Unix系统下的一个包。执行make命令需Makefile文件。make会根据Makefile文件中指令来安装软件
  • Makefile文件中有许多标签,来表示不一样的section。通常的,make会编译源代码并生成可执行文件,其实Makefile主要就是描述文件编译的相互依赖关系

第三步:make install

  • 当执行make命令不加任何参数,程序就会按照Makefile的指令在相应的section间跳转而且执行相应的命令
  • 加上install参数即执行make install时,程序只会执行install section处的命令。install section的指令会将make阶段生产的可执行文件拷贝到相应的地方,例如/usr/local/bin
  • make clean 会删除上次make生产的obj文件以及可执行文件
相关文章
相关标签/搜索