在执行"make install"之前,我应该使用"sudo"吗?

我正在按照this指南安装最新的FFmpeg。
在某些地方,它建议不使用sudo执行make install,这只是其中一个例子。
cd ~/ffmpeg_sources
wget http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
tar xjvf last_x264.tar.bz2
cd x264-snapshot*
PATH="$PATH:$HOME/bin" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --disable-openclcd ~/ffmpeg_sources
wget http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
tar xjvf last_x264.tar.bz2
cd x264-snapshot*
PATH="$PATH:$HOME/bin" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --disable-opencl
PATH="$PATH:$HOME/bin" make
make install
make distclean

我应该使用sudo make install吗?我的意图是使软件包对所有用户都可用,包括Apache/PHP。
5个回答

在你的情况下,你不需要执行sudo make install,因为你将在你的$HOME中安装库。你已经配置了构建过程,使用前缀和绑定目录将其安装在你的$HOME中。
为了使该软件包对其他程序可用,最好选择在你的$HOME之外的目录。然后,你将需要使用sudo执行make install

如果我的意图是使软件包对所有人都可用,那么我应该完全取消--prefix子句吗? - dotancohen
@dotancohen 是的。然后该库将会安装在通常用于存放库文件的位置(例如 /lib)。 - Uwe Plonus
默认情况下是/usr/local/lib。使用DESTDIR变量将其安装到单独的目录中,并使用类似GNU Stow的工具来管理/usr/local中的符号链接树可能也是个不错的主意。 - Simon Richter

这取决于您要安装软件包的位置。
在安装过程中,如果您将软件包安装在系统目录(如/usr)中,则需要输入sudo。您需要输入sudo是因为您没有该目录的写入权限。在本地安装时,在执行make install之前不需要输入sudo。

作为附加说明,考虑使用checkinstall生成一个可管理的软件包,然后使用dpkg或其他apt工具进行安装。对于从源代码安装软件来说,这样做可以在升级、移除或解决问题时减少很多麻烦。

你正在遵循的指南假设你希望将ffmpeg安装到你的HOME目录下的~/bin/。这样做的好处是不需要使用sudo进行安装,但我们将无法在所有用户中系统范围内使用ffmpeg。
此外,在默认的Ubuntu安装中,该路径不存在,自编译的系统范围软件最好放在/opt目录下。请参阅最佳安装用户应用程序的位置是什么?
如果我们需要让所有用户都能访问ffmpeg,我们应该在HOME之外的安装路径上使用make install。当然,这就需要使用sudo进行安装。另请参阅FFmpeg编译指南

如果你有疑虑,几乎肯定的答案是你不应该使用sudo。
每次尝试sudo make install时,你都会以root用户身份使系统面临潜在的错误风险。
我是一名实践经验丰富的系统管理员,并经常需要为第三方安装软件;除非有真正涉及系统层面的问题(比如内核模块),大多数软件都可以通过使用"./configure --prefix"来在用户空间中安装和运行,即使被多个用户共享。
例如,这里可见的1000多个软件组件都是在一个普通用户下设置的: https://hpc.uni.lu/users/software/ 示例:
- CUDA是由nVidia提供的GPU开发环境,可以在没有sudo的情况下安装。 - 而nVidia的GPU驱动程序需要较低级别的访问权限,因此需要使用sudo/root来完成。

1谢谢。假设我要安装一个供所有用户使用的软件,如果没有sudo权限,我该如何操作呢?您建议将二进制文件添加到每个用户的~/bin/目录中吗?或者创建一个虚拟用户software,并将他的~/bin/目录添加到所有用户的路径中? - dotancohen
@dotancohen:这个从未得到确认,我很抱歉。确实,你描述的最后一个方面正是全球高性能计算站点组织软件树的方式(多个编译器、库、MPI堆栈等),也是第三方软件的推荐方法。通常情况下,你不希望将系统(上游)软件与第三方软件混合使用,因为在后期它们的联合维护会变成一场噩梦(例如出现问题的关键点:zlib、libreadline、ncurses、boost...还有许多其他)。 - fgeorgatos
@所有人:这里是用于在HPC网站上实现此目标的技术: https://en.wikipedia.org/wiki/Environment_Modules_(software)更一般地说,盲目使用sudo make install安装数千个软件包是非常不安全的做法,因为你基本上是在说:“嘿伙计们,我相信你们都会正确地进行make安装”。你可以相信一两个人会做正确的事情,但不能相信一千个人! - fgeorgatos