我知道从源代码安装的过程是。
但为什么在“make install”之前“make”,为什么不做“make install”
到目前为止我的理解是“make”只将源代码编译成可执行文件,而“make install”实际上将它们放入可执行的PATH文件夹中,对不对?也许我没有说清楚我的问题,对此感到抱歉。
说我们想在机器上安装可执行文件,我们可以做到吗
而不是上面显示的3个步骤。
答案 0 :(得分:15)
当您运行make
时,您指示它基本上遵循特定目标的一组构建步骤。在没有参数的情况下调用make
时,它会运行第一个目标,通常只是编译项目。 make install
映射到install
目标,这通常只会将二进制文件复制到目标中。
install
目标通常取决于编译目标,因此只需运行make install
即可获得相同的结果。 但是,我可以看到至少有一个很好的理由在不同的步骤中执行这些操作:权限分离。
通常,当您安装软件时,它会进入普通用户没有写访问权限的位置(例如/usr/bin
和/usr/local/bin
)。通常,您最终必须运行make
然后sudo make install
,因为安装步骤需要权限提升。这是一个“Good Thing™”,因为它允许您的软件被编译为普通用户(这实际上对某些项目产生了影响),限制了对于行为不当的构建过程的潜在损害范围,并且只获得了root安装步骤的权限。
答案 1 :(得分:3)
make
使用 ./ Makefile (或 ./ makefile )并构建第一个目标。按照惯例,这可能是所有目标,但不一定如此。 make install
构建特殊目标安装。按照惯例,这会获取make all
的结果,并将它们安装在当前计算机上。
并非每个人都需要make install
。例如,如果您构建一个要部署在不同服务器上的Web应用程序,或者如果您使用交叉编译器(例如,您在Linux机器上构建Android应用程序),那么运行make install
是没有意义的。
在大多数情况下,单行./configure && make all install
将等同于您描述的三步流程,但这取决于产品,您的具体需求,再次,这只是一个约定。< / p>
答案 2 :(得分:1)
如今很多软件只会make install
做正确的事情。
在那些不会的情况下,安装目标不依赖于已编译的二进制文件。
因此,为了安全起见,大多数人使用make && make install
或其变体只是为了安全起见。
答案 3 :(得分:1)
有时我想尝试编译代码更改但不要部署这些更改。例如,如果我正在攻击Asterisk C代码库,并且我想确保我正在进行的更改仍然编译,我将保存并运行make。但是,我不想部署这些更改,因为我没有完成编码。
对我来说,运行make只是一种方法,可以确保我的代码中没有太多的编译错误,因为我无法找到它们。也许更有经验的C程序员没有这个问题,但对我来说,限制编译之间的更改次数有助于减少可能完全破坏我的构建的可能更改的数量,这使调试更容易。
最后,这也有助于给我一个停止点。如果我想去吃午餐,我知道有人可以重新启动应用程序当前处于工作状态而无需找到我,因为只有make install会将二进制文件复制到实际的应用程序文件夹中。
可能还有其他原因,但这是我理解这两个命令是分开的事实的原因。正如其他人所说,如果你想要它们的组合,你可以使用你的shell来组合它们。