原文地址:http://www.cnblogs.com/Jerry-Chou/archive/2010/12/18/1909843.html

翻译一篇文章,我最早从这篇文章中了解到为什么Linux平台上,从源代码安装软件通常都需要这三步:./configure,  make,  make install 。译文如下:

我总是听人们说,通常只要使用configure, make, make install来让程序可以运行。不幸的是大多数现在用电脑的是根本没有使用过compiler,或是写过一行代码。随着图形用户接口(GUI),应用程序构建工具(application builder)的出现,现在很多真正的程序员也不用configure; make; make install了。

你所要做的有三步,每一步都会使用现有的程序使得一个新的程序就绪或运行。在make之前先要使用configure,但每一步都会有着不同的目的。接来我会解释第二步(make)和第三步(make install),之后我会再解释configure.

make这个实用工作已经成为Unix历史的一部分了。设计它的主要目的是减少程序员的记忆负担。我猜,更好的说法是它减少了程序员所需编写的文档。在任何情况下,一旦你建立了一套make可以理解的规则去创建一个程序,你就不用再惦记着他们(这套规则)了。

为了让这些工作变得简单,make实用工具有一套内建的规则,你只要告诉make构建你的程序所需的规则。举例来说,你输入了make love,make会根据你的输入寻找一些规则,如果你压根就没有建立规则,他们使用内建的规则,其中的一个内建规则就是运行Linker,找到 程序名.o 结尾文件去产生一个可执行文件。

所以,make会去到名为love.o的文件。但make并不会止步于此。即使它找到了.o文件,它还有一组规则确保.o文件是最新的。换句话说,就是比源代码文件要新。在Linux系统中,最常的源代码是用C语言所编写的以.c为后缀的文件。

如果make同时找到了.c文件(love.c)和.o文件,它会查看它们俩的时间戳来确保.o文件更加新一些,如果没有.c文件新,或是.o文件不存在,make会使用另一组内建的规则用.c文件(使用C compiler)构建一个新的.o文件。对其它类型的编程也会采用相同的规则。最终当make运行完成后,会有一个最新的可执行程序生成。

顺便提一个Unix上的笑话,来自于早期版本make。当make找不到所需的文件时,例如没有love.o,love.c或其它格式的源代码文件,make程序会说:
make: don’t know how to make love. Stop.

再回到正题,通常make使用当前目录下的Makefile。如果你有一个程序源代码文件,那边有Makefile,你可以看一看。他就内容就是普通文本。单词后跟冒号行就是目标(target),也就是你紧随make命令之后输入的东西。make根据你的不同输入执行一些不同的操作。如果你只是输入make而不跟随任何命令,第一个目标将会被执行。

在大多数make文件的开头部分,你最有可能见到的是一些类似赋值的语句。每行有很多字段,字段间用等号相连。它们用来设置make的内部变量。常见的设置如C compiler的位置,程序的版本号,等类似的东西。

现在是回到谈configure的时候了。在不同的系统中C compiler可能位于不同的位置,你可能使用zsh而不是bash作为你的shell,程序可能需要知道你的主机名,可能会使用dbm库,需要知道系统中安装的是gdbm库,还是ndbm库,等等,等等。为了完成这些配置,时常需要修改Makefile。另外一个让程序员痛苦的是:任何时候你想要在一个新的系统中安装软件,你都需要重新列举出这些配置。

伴随着越来越多的软件被开发出来,更多兼容POSIX系统出现,这些配置的工作越来越难做。这时configure出现了。它是一个shell脚本(通常用GNU Autoconf来编写),它来寻找一些工具的位置,试图看这些工具是否可以工作。之后便按照Makefile.in文件的指示生成可能在当前系统中工作Makefile(可能还有别的文件)。

背景知道介绍完了,让我们总结一下吧:

你运行configure(通常你在shell中输入./configure),这会生成一个新的Makefile文件。
    键入make命令,构建程序。他会在Makefile中找到第一个target,根据第一个target的说明来构建可执行文件。这步的目的就是生成一个可执行文件。
    现在,以root的身份键入make install。再次调用make找到一个名为install的target,根据这个target指定的文件和目录安装软件。

这是一个简化了的解释,但在大多数情况下,你知道这些就足够了。大多数程序都会有一个名为INSTALL的文件,这个文件包含了安装步骤,和一些注意事项。比如,提供一些选项给configure命令来改变最终可执行文件的目录。同时还会有其它的make target,诸如clean,用来在安装完成后执行一些清理工作。还有些时候会有test这个target,允许你在make和make install这两个步骤之间测试生成的可执行软件。

Win或Linux中编译安装软件的命令解析: configure; make; make install的更多相关文章

  1. Linux中编译安装软件的基本流程

    1. 准备软件包源文件 从互联网下载相应的软件包(以 .tar.gz 或 .tar.bz2 为后缀),将tarball文件解压到/usr/local/src目录下,并切换到软件包目录下 : 2. ./ ...

  2. linux中编译安装Apache、PHP、MySQL(上)

    1.简介 在阿里云买了个云服务器,一直没时间折腾.过了近十天了吧,才有时间好好玩玩这个云服务器.自己是做Web开发的,所以我需要的开发环境是LAMP.之前打算是采用yum安装,不过yum安装apach ...

  3. linux安装软件的几种方法----linux下编译安装软件的一般步骤

    linux安装软件的几种方法: 一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd so ...

  4. [转]linux中如何安装软件?

    Linux下软件的安装与卸载     在Windows下安装软件时,只需运行软件的安装程序(setup.install等)或者用zip等解压缩软件解开即可安装,运行反安装程序 (uninstall.u ...

  5. linux系统编译安装软件的通用步骤

    编译安装的步骤: 1.下载源代码,并解压     tar -xf package-version.tar.{gz|bz2|xz} 注意:展开后的目录通常为package-version 2.切换至源码 ...

  6. Linux 下编译安装软件,找不到共享库 xx.so 的解决办法

    编译memcached时,报错没有libevent,于是下载libevent,configure , make && make install ,然后在重新安装memcache成功之后 ...

  7. linux 如何编译安装软件

  8. linux下编译安装php5.6出现 configure: error: Cannot find MySQL header files under /usr/local/mysql.

    #yum install gcc gcc-c++ libxml2 libxml2-devel libjpeg-devel libpng-devel freetype-devel openssl-dev ...

  9. linux下自己安装软件做成命令

    安装nodejs,从官网下下来的是一个压缩包,解压下里面有可执行文件.教程上用ln -s [可执行文件的绝对路径] [/usr/local/bin/]建了一个软连接,这样就能直接无视路径,用命令行调用 ...

随机推荐

  1. LuoguP2765 魔术球问题(最大流)

    题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...

  2. docker 部署 jenkins server

    1. 拉取一个jenkins 镜像 docker pull jenkins 2. 创建与jenkins配置目录对应的,容器外的,文件目录,并修改相应的权限 mkdir /home/jenkins ch ...

  3. IntelliJ IDEA 中如何配置多个jdk版本即(1.7和1.8两个jdk都可用)

    IntelliJ IDEA使用教程 (总目录篇) 有时候需要看Java源码,但是 Java 1.7 和 Java 1.8的差别的关系,有时候你想查看不同jdk版本的Java源码. 或者你的项目需要测试 ...

  4. 怎样扩展Chromium各层的接口

    加入新功能时,可能须要添加各层的接口,接口怎样加?必定须要向Chromium的原则看齐. 首先Chromium的模块设计遵循依赖倒置原则,上层模块依赖于低层模块.低层模块不会依赖上层模块的实现. 再者 ...

  5. Android eclipse 提示java代码 快捷键

    1.提示java代码能够用ALT+/ 键就能够了(前提是你要把你须要的类或方法的首字母打出来).我添加的部分:仅仅要输入sysout,然后alt+/键就能够输出System.out.prinln(), ...

  6. 01-Jvm 内存区域复习笔记

    Java内存区域          1.程序计数器(Program Counter Register)         在虚拟机中一块较小的内存空间.它的作用能够看做是当前线程所运行的字节码的行号指示 ...

  7. js插件---放大镜如何使用

    js插件---放大镜如何使用 一.总结 一句话总结:一张高清图片被用了两次,一次做缩略图,一次做放大后显示用的的图片(其实这个图片就是高清图片本身,而且是部分) 14 <figure class ...

  8. C# Find() 与 FindAll()方法的使用

    Find()   :检索与指定匹配的第一个元素 FindAll()   : 检索与指定匹配的所有元素 如:List<string> strList=new List<string&g ...

  9. JavaScript--数据结构与算法之列表

    3.1 列表的抽象数据类型定义 列表:一组有序的数据.每个列表中的数据称为元素.在JavaScript中列表的元素可以是任意的数据类型.列表中保存的元素没有事先的限定,实际使用时的元素数量受到程序内存 ...

  10. tomcat做成windows服务之后使用JMX监控的问题

    转载:http://blog.chinaunix.net/uid-20449851-id-2369842.html