2013-05-19 95 views
7

我知道从源码安装的过程是。为什么在“make install”之前“make”

  1. 的./configure
  2. 使
  3. 使安装

但为什么 “让安装” 之前 “做”,为什么不只是做 “让安装”

我的了解,以便“make”只是将源代码编译成可执行文件,而“make install”实际上将它们放入可执行文件夹中,对吗?

也许我没有明确表示我的问题,并对此表示遗憾。

说,我们要在机器上安装可执行文件,我们可以做

  1. 的./configure
  2. 使安装的

,而不是以上3个步骤。

回答

10

当您运行make,你指示它基本上遵循一套构建步骤特定目标。当不带参数调用make时,它运行第一个目标,它通常只是编译项目。 make install映射到install目标,它通常不会将二进制文件复制到目标中。

通常,install目标取决于编译目标,因此只需运行make install即可获得相同的结果。 但是,我可以看到至少有一个很好的理由在分开的步骤:特权分离。

通常,当您安装软件时,它会进入普通用户没有写权限的位置(如/usr/bin/usr/local/bin)。通常情况下,最终实际上必须运行make,然后运行sudo make install,因为安装步骤需要权限升级。这是一个“Good Thing™”,因为它允许您的软件作为普通用户进行编译(这对某些项目实际上有所不同),限制了严重行为构建过程的潜在损害范围,并且仅获取根安装步骤的权限。

+0

只是旁注:“make”没有任何评论会跳过任何通配符目标。 '%'相当于目标名称的正则表达式'+'。防爆。如果您有3个目标:1)“%_targetsuffix:”2)“wildTarget:”3)“defaultTarget:”按此顺序从上到下。 “make”命令将跳过“%_youtargetsuffic:”并构建“wildTarget:”(“defaultTarget:”被忽略,因为“wildTarget:”在它之前)。对不起,我不知道如何格式化评论以提高可读性。 – funa68

0

很多软件这些日子只会做make install正确的事情。 在那些不会的情况下,安装目标不会依赖编译的二进制文件。 所以为了安全起见,大多数人使用make && make install或其变体只是为了安全起见。

3

make不带参数取./Makefile(或./makefile),并构建第一目标。按照惯例,这可能是所有目标,但不一定。 make install建立特殊目标,安装。按照惯例,这需要make all的结果,并将它们安装在当前计算机上。

不是每个人都需要make install。例如,如果您构建了一个Web应用程序以部署在不同的服务器上,或者如果您使用交叉编译器(例如,您在Linux机器上构建Android应用程序),则运行make install是没有意义的。

在大多数情况下,单行./configure && make all install将等同于您描述的三步过程,但这取决于产品,根据您的具体需求,而且这仅仅是一个约定。

1

有几次我想尝试编译代码更改但不部署这些更改。例如,如果我要攻击Asterisk C代码库,并且我想确保我所做的更改仍然可以编译,那么我将保存并运行make。但是,我不想部署这些更改,因为我没有编写代码。

对我来说,运行make只是一种方法,可以确保我的代码中没有太多的编译错误,导致我无法定位它们。也许更有经验的C程序员没有这个问题,但对我来说,限制编译之间的变化次数有助于减少可能已经完全丢弃我的构建的可能变化的数量,这使得调试更容易。

最后,这也有助于给我一个停止点。如果我想去吃午饭,我知道有人可以在当前工作状态下重新启动应用程序,而无需找到我,因为只有进行安装才能将二进制文件复制到实际的应用程序文件夹中。

可能还有其他原因,但这是我接受两个命令分开的原因。正如其他人所说,如果你想让他们结合起来,你可以使用你的shell将它们结合起来。