为什么在"make install"之前"make"

agg*_*exp 13 makefile

我知道从源代码安装的过程是.

  1. ./配置
  2. 使
  3. make install

但为什么在"make install"之前"make",为什么不做"make install"

到目前为止我的理解是"make"只将源代码编译成可执行文件,而"make install"实际上将它们放入可执行文件PATH文件夹中,对不对?

也许我没有说清楚我的问题,对此感到抱歉.

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

  1. ./配置
  2. make install

而不是上面显示的3个步骤.

Mat*_*ude 16

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

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

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


Jen*_*ens 5

如今,许多软件只需使用make install. 在那些不会的情况下,安装目标不依赖于已编译的二进制文件。因此,为了安全起见,大多数人都会使用make && make install或其变体。


Ale*_*ohn 5

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

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

在大多数情况下,单行./configure && make all install相当于您描述的三步流程,但这取决于产品和您的特定需求,同样,这只是约定俗成。


jmo*_*253 5

有时我想尝试编译代码更改但不部署这些更改。例如,如果我正在破解 Asterisk C 代码库,并且我想确保所做的更改仍然可以编译,我将保存并运行 make。但是,我不想部署这些更改,因为我还没有完成编码。

对我来说,运行 make 只是一种确保我的代码中不会出现太多编译错误而无法找到它们的方法。也许更有经验的 C 程序员不会遇到这个问题,但对我来说,限制编译之间的更改数量有助于减少可能完全破坏我的构建的可能更改的数量,这使得调试更容易。

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

很可能还有其他原因,但这是我接受这两个命令是分开的事实的原因。正如其他人所说,如果您希望将它们组合起来,您可以使用 shell 将它们组合起来。