原文地址: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. mysql 编码错误修改

    set character_set_results=utf8;

  2. 小米开源文件管理器MiCodeFileExplorer-源码研究(6)-媒体文件MediaFile和文件类型MimeUtils

    接着之前的第4篇,本篇的2个类,仍然是工具类.MediaFile,媒体文件,定义了一大堆的常量,真正的有用的方法就几个.isAudioFileType.isVideoFileType之类的. Mime ...

  3. iOS - 系统经常使用框架(framework)的简介

    系统框架(framework)的简介 ImageIO  - 该框架的接口可用于导入或导出图像数据及图像元数据 CoreTelephony  - 获取IMSI号,SIM卡背面的号码是SIM卡的电子串号, ...

  4. python核心编程五——映像和集合

    1.字典 不同意一个键相应多个值:当有键发生冲突(即.字典键反复赋值),取最后(近期)的赋值. >>> dict1 = {' foo':789, 'foo': 'xyz'}     ...

  5. sql简单的语句

    选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delet ...

  6. node --进行后台的环境搭建

    1.下载winscp  --- 输入IP 端口 账号 密码  进入当前的服务器环境 2.下载xshell5 ---- 输入IP 端口  和 winscp 达成连接. 3.把本地代码放置 winscp远 ...

  7. Spark通过YARN提交任务不成功(包含YARN cluster和YARN client)

    无论用YARN cluster和YARN client来跑,均会出现如下问题. [spark@master spark-1.6.1-bin-hadoop2.6]$ jps 2049 NameNode ...

  8. ubuntu14.04.32 vmware11开发环境搭建

    win7 64  vmware11 ubuntu14.04.32 在vmaware上安装ubuntu,自定义安装,选择区域为上海,这样数据源就会自动设置为中国,获取网络数据会较快,也可以安装完之后改变 ...

  9. 记阮一峰---JavaScript 标准参考教程之标准库-Object对象

    在看到阮大神的-标准库-Object对象时 有个 类型判断类型 方法可能以后会用到.特此记录一下 4.3:toString()的应用:判断数据类型 Object.prototype.toString方 ...

  10. CF1009F Dominant Indices(树上DSU/长链剖分)

    题目大意: 就是给你一棵以1为根的树,询问每一个节点的子树内节点数最多的深度(相对于这个子树根而言)若有多解,输出最小的. 解题思路: 这道题用树链剖分,两种思路: 1.树上DSU 首先想一下最暴力的 ...