从源代码安装应用程序

我想了解一下Linux中所有应用程序的通用安装方式。这是什么意思呢?嗯,当我使用Windows时,我知道如果要安装一个应用程序,我只需双击.exe文件然后点击下一步、下一步、下一步。
在Linux中,我了解到可能有一种常见(非通用)的方法来安装任何应用程序。是从源代码安装吗?那么是否有一种逐步方法可以像在Windows中那样安装应用程序呢?
我问这个问题是因为我不想一直向谷歌询问“如何安装”。最近我成功地从源代码安装了FreeCAD,参考了this guide,我认为这是一个很好的起点作为通用方法,对吗?
但问题是,如何找到正确的源代码,以及当一个应用程序有非常独特的安装方法时该怎么办!

可能是如何从.tar.gz安装的重复问题? - Tachyons
不,我觉得我的问题很清楚!只是需要更详细的信息。 - gabriel
非常非常非常如何 http://www.howtogeek.com/105413/how-to-compile-and-install-from-source-on-ubuntu/ - Mohammad Reza Rezwani
5个回答

安装说明因程序而异,尽管有一些成熟的工具,如autotools(包括automake和autoconf)和cmake。

由于程序可以使用不同的编程语言,很难给出适用于所有软件包的通用命令。例如,Python通常有setup.py脚本,而C程序通常使用autotools或至少一个Makefile。

我总是从查找INSTALL、README或类似文件开始。如果您需要从源代码编译程序,您可能需要build-essential软件包,该软件包依赖于编译器和其他通用开发软件包。

根据您要编译的程序,您可能需要安装其他依赖项。请查看README或./configure脚本的输出(这是一个位于提取源代码根目录中的可执行文件)。例如,如果它说您需要“x11开发头文件”,请尝试在存储库中找到“x11-dev”或“libx11-dev”(在这种情况下,您要找的是libx11-dev)。

使用autoconf/automake构建的源代码分发可以通过以下方式提取和配置:

tar xf foo-1.0.tar.gz
cd foo-1.0
./configure
make
sudo make install

使用./configure --help查看可用选项。默认情况下,文件通常安装在/usr/local中,这是完全可以的。除非您要将文件打包成.deb文件,否则不要将此前缀更改为/usr,因为它可能与软件包管理系统(dpkg)发生冲突。 make应该开始编译所有内容,而make install将文件安装到指定位置(写入特权位置如/usr/local需要sudo)。要稍后卸载它,请从源目录运行sudo make uninstall(前提是软件包已经正确构建了autoconf/automake,这是开发人员的责任,而不是您作为用户的责任!)
如果您只是想从计算机上的软件中心编译软件包,请按照以下步骤进行(相应地替换package和版本):
sudo apt-get build-dep package
apt-get source package
cd package-1.0
dpkg-buildpackage -b -uc -us

请参阅各自的手册页面,以获取有关命令的更多详细信息(例如,在终端中运行man dpkg-buildpackage)。执行这些命令后,您将在父目录中获得一个.deb文件。建议尽可能使用Ubuntu软件源中的软件包。上述步骤仅供教育目的,通常在构建软件包之前,您需要对某些文件进行修改。

确实非常有帮助,所以唯一常见的方法就是下载软件包(tar??),然后解压以查看其内容!之后我必须问一下,我是先解压文件,然后运行你上面提到的所有命令。所以安装文件就是我在执行所有这些命令的那个文件吗?还是所有应用程序文件和目录都是特定的,无论是从中心安装还是从源代码安装?为了明确起见,我只想将应用程序安装在我想要的任何位置,比如/opt或/usr。谢谢 - gabriel
请查看更新的帖子。提取和更改目录在99%的情况下都是必需的。您可能会看到以.tar结尾的不同扩展名,如.gz、.bz2、.xz。这些是压缩格式的表示方式。.zip不太常见,因为它无法存储文件权限,但至少在7-zip中可以看到它。注意:我的指示更多地适用于“从源代码编译”。路径和配置与Ubuntu软件中心的不同。 - Lekensteyn
所以,无论我在哪个目录中使用./configure、make和make install命令都没有关系。例如,如果我在主目录中下载和提取文件,然后运行这些命令,make install命令会自动将安装文件放置在特定的目录中,对吗? - gabriel
没有像Windows的"Program Files"那样的特定目录,对吧? - gabriel
提取tarball后,将目录更改为提取的目录。确切位置并不重要,您可以在主目录或/Downloads中进行操作,只需确保路径中不含空格,因为这会破坏大多数工具。例如,“/Downloaded Sources”是一个不好的想法,而“~/Downloaded-sources”则完全没问题。至于您最后一个问题,请参阅http://askubuntu.com/q/27213/6969。 - Lekensteyn
好的,那么我在提取的目录中运行命令,然后呢?我能指定安装位置吗,还是安装文件只是分散在其他帖子所指的目录中?谢谢。 - gabriel
你可以自己测试一下,而不是运行 sudo make install,使用 make install DESTDIR=/tmp/fs。然后运行 find /tmp/fs -ls 来查找安装在哪个目录下的文件(假设程序使用 autotools)。 - Lekensteyn
也许可以提一下checkinstall,这样你就可以将源代码安装为一个软件包。 - Callum Rogers
我以前没有使用过checkinstall,所以无法对其发表意见。使用debuild/dpkg-buildpackage构建.deb软件包更加方便。 - Lekensteyn
checkinstall 是用于尚未进行 Debian 包装的源代码树。它可以监视安装过程并从中创建一个 .deb 文件,只要您不需要指定任何配置文件或运行任何 postinst 脚本,这是完全可行的。 - Scott Severance

FreeCAD可以在Ubuntu软件中心中找到,所以不需要从源代码构建和安装它。
Ubuntu软件中心总是你应该首先查看的地方。安装只是点击一个按钮的事情。
屏幕左侧的栏上有一个Ubuntu软件中心的图标。
如果你真的想要从源代码构建和安装一个程序,那么请查找随程序附带的README文件或其他说明。
许多软件包使用GNU autotools作为构建系统,并可以使用以下命令进行构建和安装:
./configure
make
sudo make install

在构建程序之前,您需要检查所需的库和其他依赖项(这也应该在程序的文档中提到)。在packages.ubuntu.com上,您可以找到包含所需库的Ubuntu软件包。
假设程序需要一个名为blah的库,那么您可能需要安装libblah-dev软件包(请在上述提到的Ubuntu软件包页面上查找确切的名称)。
sudo apt-get install libblah-dev

哈哈,是的,我知道这个图标!但是如果你注意到在软件中心的任何应用程序的描述中都会说“Canonical不提供关键更新”,而且FreeCAD的版本是0.8,而我安装的是FreeCAD v0.13。我只是想对Linux系统有更深入的了解,而不是得到指向软件中心的答案,不过还是谢谢!:-) - gabriel
现在你说得对!非常感谢,这就是我想要的更深入的知识!继续吧! - gabriel
好的,所以如果我想从源代码安装应用程序,这个应用程序的开发者必须提供源代码对吗?例如,如果我想安装一个商业应用程序,我就不能从源代码安装对吧?这是一个开源项目,对吗?也就是说,开源应用程序的源代码对所有人都是开放的,但商业应用程序不是。对吗? - gabriel
如果我想从源代码安装应用程序,这个应用程序的开发者必须提供源代码吗?- 当然,这就是“从源代码”的意思!如果它是一个不开源的商业程序,那么你就没有办法获取源代码。 - Jesper
所以这就是为什么大多数Windows应用程序无法在Linux上安装的原因,对吗? - gabriel
大多数软件都是为特定的操作系统编写的。为Windows编写的程序在Linux上无法运行,事实上,即使你有源代码,也无法将其编译成适用于Linux的程序,因为操作系统的功能不同。 - Jesper
是的,所以开源不仅仅适用于Linux,它也有适用于Windows、Linux、Mac等操作系统的版本。所以,如果我从一家公司购买了一个程序,即使我具备所有必要的知识,我也无法在Linux上运行它,对吗?谢谢你的回答。 - gabriel
是的,Windows、Mac等操作系统也有开源软件。大多数商业软件都不是开源的,你不能在其他操作系统上运行它们。有一些像Wine这样的工具可以让Windows软件在Linux上运行,但是这种方法有限制,不是所有的软件都能够兼容。 - Jesper
@gabriel 为Windows设计的程序与Linux不兼容,同样的道理,该程序也无法在OSX上安装,反之亦然。Windows应用程序并不意味着它是闭源的,这就是为什么不能在Linux上安装的原因。Chromium项目(Google Chrome基于此)是开源的,您可以查看代码并编译为Windows。在Linux中,也可以有闭源程序,如NVIDIA驱动程序、Flash等。那么你可能会问为什么在Linux中“从源代码编译”有时更可取?这是因为Linux有太多的变体,最常见的方法就是自己编译。 - Web-E
好的,非常感谢!我不会在这篇帖子中询问关于葡萄酒的问题,但如果你能在我的另一篇帖子中帮助我,那就太棒了! - gabriel
http://askubuntu.com/questions/121528/autocad-on-linux-ubuntu-11-10 - gabriel
实际上,可以编写同时适用于Windows和Linux的程序。控制台的一个简单示例程序如“Hello World”可以在两个操作系统上使用相同的代码。在Windows上,推荐使用其他库函数。即使您不使用POSIX标准库函数,也可以使用跨平台库(例如GLib或GTK),它们将处理系统特定的细节并为您提供一个更抽象的编程层。 - Lekensteyn

只有两种基本方法:
1. 使用软件中心或相关工具(Synaptic、apt-get等)。这通常是最好的选择。超出此方法可能会导致问题,如冲突和更新困难,因此只有在您知道自己在做什么时才应该这样做。
2. 阅读文档并使用它进行安装。您可以在项目的网站上找到它,或者在tarball中找到它,或者从您获取文件的地方找到它。或者,可能没有文档,这种情况下您必须使用谷歌或猜测。安装软件有很多不同的方法。如果这让您感到困惑,请回到第1步。
如果您的软件包使用标准的./configure; make; sudo make install,您可以使用checkinstall来获得您构建的.deb文件。这样,您就不必牺牲软件包管理。

好的,我问这个问题是因为我在软件中心和.deb文件方面遇到了一些问题。例如,我想安装DraftSight,一个CAD程序,但它只适用于32位系统。所以我尝试使用忽略依赖和架构命令,但没有任何结果。那么,例如,是否可能提取.deb文件,然后通过make和sudo make等手动安装呢?谢谢。 - gabriel
如果您的架构没有可用的.deb文件,那么您将需要以其他方式安装程序。您可以通过谷歌搜索其他人是如何做到的,或者寻找具有正确架构的.dev文件,或者从源代码构建。请查看我即将发布的重要编辑内容。 - Scott Severance
在我们运行这些命令之前,需要先安装checkinstall吗?然后,一个.deb文件会出现吗?(我想问一下你是如何使你的帖子看起来漂亮和有条理的?有没有关于askubuntu的指南可以参考?)所以我可以提取一个.deb文件,然后使用checkinstall,在64位系统上运行它,这样做对吗?或者我对这个问题是错误和愚蠢的? - gabriel
你不能在现有的 .deb 包上使用 checkinstall。如果你已经有一个 .deb 文件,从技术上讲,你可以提取它并手动安装,但这不是最好的方法。checkinstall 是用于从源代码构建时使用的。有关格式化帮助,请参阅发布时始终显示的帮助链接。 - Scott Severance
所以,我手头有一个与64位架构不同的.deb文件,应该不需要手动提取和安装吗?当你说“用于从源代码构建时”时,.deb文件是从哪里构建的呢?它使用与你从源代码构建时相同的源代码吗?这个问题很傻吗? - gabriel
.deb文件是从源代码构建的。 apt-get source ...。但你一直在谈论获取程序的源代码。那就是我所说的。你应该把.deb视为一个不透明的文件,除了安装它以外,什么都不能做。 - Scott Severance

从源代码安装非常困难以支持。

尽可能从软件中心安装。这相当于Windows的下一步->下一步->完成的思维方式。

你也可以在Windows上从源代码安装东西。这不是Linux独有的,只是更多的源代码可用应用程序针对Linux。


1嗯,我只是想深入了解我的Linux经验,我已经有三年了,我想要的是最终不再问如何和如何,你感觉到了吗?只是为了让我的Linux知识更加深入。为什么不向我解释源等呢? - gabriel
http://www.linuxfromscratch.org/ - RobotHumans
还有,当我的Ubuntu中的应用程序没有.deb文件时,如何从软件中心安装?然后我准备再次在askubuntu.com或google.gr上询问“如何在Ubuntu 11.10中安装THIS?” - gabriel
是的。应用特定的更好。它们为特定用户提供有针对性且可重复的答案。因此它们非常有用。 - RobotHumans
嗯,这确实非常有帮助。你刚刚理解了我的需求并给予了我所需要的。但是我想问一下,在对Linux和Linux系统进行了很多阅读之后,我是否永远无法在Linux系统中安装任何应用程序?或者说这种情况根本不可能发生? - gabriel

Ubuntu提供了多种安装方法。
1. 通过集中式软件包系统 这是Ubuntu中首选的方法(但个人不喜欢)。软件中心、Synaptic和aptitude都是其示例。
2. 独立的deb软件包:这种方法与Windows类似,只需双击文件并点击安装按钮即可。例如:Gdebi软件包管理器。
3. 二进制软件:这些与Windows的.exe安装非常相似,提供了各种图形界面的安装程序,通常是.bin文件。您可以使用BitRock或类似工具创建此类软件包。
4. Autopackage和类似工具:这些是第三方软件包管理器,用于支持各种Linux发行版。
5. 源代码:这是软件安装中的第一种方法。在此方法中,源代码被转换为二进制可执行文件,这些软件的安装说明通常附带在源代码中,并且仅适用于开源软件。
警告:这只是我的观察,我是一个Linux新手,如果有任何错误,请随意编辑/反对。

非常感谢。根据我的经验,我通常在软件中心看到一个应用的描述,如果Canonical提供更新,我就会从中心安装。如果没有提供更新,我就会去搜索,这就是为什么我发出这个问题的原因,所有的答案都非常有帮助。谢谢。 - gabriel
选项1比3和4要好得多,因为可以自动获取更新。当你的软件包或版本不在你的仓库(选项1)中时,选项2也是可以的。如果有可能尽量避免选择3和4,因为它们无法充分利用软件包管理的所有优点,并且可能导致后续冲突。尽管Autopackage有自己的软件包管理,但它仍然是一个独立的系统,可能存在冲突和过期的问题。除非你是程序员,否则尽量避免从源代码构建。软件包管理是一件很棒的事情! - Scott Severance
我只喜欢这些方法,因为我的网络连接很慢 :p - Tachyons