原文地址: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. tree ---树状显示

    tree命令以树状图列出目录的内容. 语法 tree(选项)(参数) 选项 -a:显示所有文件和目录: -A:使用ASNI绘图字符显示树状图而非以ASCII字符组合: -C:在文件和目录清单加上色彩, ...

  2. Mybatis 一对多 多对1

    http://blog.csdn.net/z69183787/article/details/46833565 http://blog.csdn.net/rain097790/article/deta ...

  3. 使用Ant 和 Maven打包发布命令行程序(转载)

    From:https://www.linux178.com/Java/maven-release.html 用Java写了一个命令行的小程序,使用的Intellij IDE是IDEA13原来一直使用A ...

  4. 制作U盘启动盘将Ubuntu 12.04升级为14.04的方法

    1 介绍 在周六的下午,我决定想高速浏览一下书籍[1].看看这个关于Ubuntu的圣经到底在讲什么东东. 感觉讲的不错,当我看到介绍文件标记语言-TeX和LaTeX的时候,该书作者推荐在Ubuntu上 ...

  5. 聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁

    这篇讲讲ReentrantReadWriteLock可重入读写锁,它不仅是读写锁的实现,而且支持可重入性. 聊聊高并发(十五)实现一个简单的读-写锁(共享-排他锁) 这篇讲了怎样模拟一个读写锁. 可重 ...

  6. 11lession-class 类

    python既然也是面向对象编程的语言,自然也就跟java相似,它也有类的概念.今天就简单学习下.看如下代码 #!/usr/bin/python class cl_test: test = 0 def ...

  7. 解决eclipse端口被占用的问题

    问题如图所示,在eclipse中开启tomcat服务器时报错:端口已被占用. 这是因为在tomcat开启的状态下,eclipse异常关闭,导致tomcat一直占用端口. 解决办法如下: 1: 输入命令 ...

  8. libcurl 上传文件至 web服务器

    测试环境搭建, 使用 wamp server (windows下的 apache+MySQL+php) libcurl vc6 工程代码  下载地址:  http://download.csdn.ne ...

  9. 40.【IntelliJ IDEA】使用idea解决新建jsp文件而找不到jsp文件模版的新建选项

    转自:https://www.cnblogs.com/sxdcgaq8080/p/7676294.html 使用idea解决新建jsp文件而找不到jsp文件模版的新建选项,这样每次创建一个新的jsp文 ...

  10. Excel数据比对-批量数据比对

    1.导出现场的Excel收费规则2.有专门的代码写的测试收费规则的工具(开发自己开发的)3.在这个工具上选择,导出的收费规则Excel,点击导出按钮(导出按钮里面有计算每一列的计费结果4.Excel里 ...