西蒙!我知道你的感受; 我在学习Linux的这一部分上也很努力。根据我自己的经验,我编写了有关您要解决的某些项目的教程(主要是作为我自己的参考!):http : //easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html。我想您会赞赏我关于如何构建/安装简单Python应用程序的说明。:)
希望这会有所帮助!祝编译愉快。
蒂姆·琼斯
在Ubuntu Linux中从源代码构建/安装应用程序
尽管Ubuntu存储库中充斥着许多出色的应用程序,但您一定会偶然发现该存储库中没有(或没有Debian软件包)的“必备”工具,或者您需要一个比版本库中的版本新。你是做什么?好吧,您必须从源代码构建应用程序!不用担心,它实际上并不像听起来那样复杂。根据我从成为业余爱好者的经验,这里有一些技巧!(尽管我在本示例中使用Ubuntu,但一般概念应适用于大多数Unix / Linux发行版,例如Fedora,甚至Windows上的Cygwin平台。)
从源代码构建(编译)大多数应用程序的基本过程按以下顺序进行:配置->编译->安装。执行这些操作的典型Unix / Linux命令为:config
-> make
-> make install
。在某些情况下,您甚至会找到显示所有这些都可以组合为单个命令的网页:
$ config && make && make install
当然,该命令假定所有这些步骤都没有问题。这就是乐趣的源头!
入门
如果您以前从未从系统上的源代码中编译过一个应用程序,则可能需要使用一些通用的开发工具(例如gcc
编译器套件),一些常见的头文件(将其视为已经编写的代码)进行设置。由正在安装的程序使用的其他人)和make工具。幸运的是,在Ubuntu中,有一个名为metapackage的安装包build-essential
。要安装它(或只是确保已经有它!),请在终端中运行以下命令:
$ sudo apt-get install build-essential
现在您已经有了基本设置,下载应用程序源文件并将其保存到您具有读/写权限的目录中,例如“主”目录。通常,这些文件将位于文件扩展名为.tar.gz
或的存档文件中.tar.bz2
。这.tar
只是意味着它是一个“磁带存档”,是保留其相对目录结构的一组文件。的.gz
代表的gzip(GNU拉链),这是一个受欢迎的Unix / Linux的压缩格式。同样,.bz2
bzip2的缩写,它是一种新的压缩格式,比gzip提供更高的压缩率(更小的压缩文件大小)。
下载源文件后,打开一个终端窗口(Ubuntu菜单中的System Terminal),然后转到保存文件的目录。(我将~/download
在此示例中使用。这里,“〜”是您“主”目录的快捷方式。)使用tar命令从下载的存档文件中提取文件:
如果您的文件是gzip存档(例如,以结尾.tar.gz
),请使用以下命令:
$ tar -zxvf filename.tar.gz
如果您的文件是bzip2归档文件(例如,以结尾.tar.bz2
),请使用以下命令:
$ tar -jxvf filename.tar.gz
提示:如果您不想记住用于提取档案的所有命令行开关,建议您使用以下一个或两个实用程序:dtrx(我的最爱!)或deco(更受欢迎)。使用这些实用程序中的任何一个,您只需输入实用程序的名称(dtrx或deco)和文件名,其余的全部由它完成。这两个“知道”如何处理您可能会遇到的大多数存档格式,并且它们具有出色的错误处理能力。
从源构建时,可能会遇到两种常见的错误类型:
- 当您运行配置脚本(通常名为config或configure)以创建特定于您的安装程序的生成文件时,会发生配置错误。
- 当您运行make命令(在生成makefile之后)并且编译器无法找到所需的某些代码时,会发生编译器错误。
我们将研究每个问题,并讨论如何解决它们。
配置和配置错误
提取源代码存档文件后,在终端中,应切换到包含所提取文件的目录。通常,此目录名称将与文件名相同(不带.tar.gz
或.tar.bz2
扩展名)。但是,有时目录名称只是应用程序的名称,而没有任何版本信息。
在源目录中查找README
文件和/或INSTALL
文件(或名称相似的文件)。这些文件通常包含有关如何构建/编译应用程序以及如何安装应用程序的有用信息,包括有关依赖项的信息。“依赖项”只是成功编译所需的其他组件或库的奇特名称。
阅读README
and和/或INSTALL
文件(并希望查看了该应用程序的任何相关在线文档)之后,请查找名为config
或的可执行文件(在文件上设置了“ x”权限)configure
。有时文件可能带有扩展名,例如.sh
(config.sh
)。这通常是一个运行其他实用程序的shell脚本,以确认您具有“健全”的编译环境。换句话说,它将检查以确保您已安装了所需的所有内容。
提示:如果这是基于Python的应用程序,而不是配置文件,则应找到名为的文件setup.py
。Python应用程序通常非常易于安装。要以根用户身份安装此应用程序(例如,在Ubuntu下,将sudo放在以下命令的前面),请运行以下命令:
$ python setup.py install
那应该是您需要做的所有事情。您可以跳过本教程的其余部分,直接继续使用和享受您的应用程序。
在终端中运行配置脚本。通常,您可以(并且应该!)使用常规用户帐户运行配置脚本。
$ ./config
该脚本将显示一些消息,以使您了解它在做什么。通常,脚本会提示您是成功还是失败,如果失败,还会提供一些有关失败原因的信息。如果没有收到任何错误消息,那么通常可以假设一切正常。
如果找不到任何看起来像配置脚本的脚本,则通常意味着该应用程序非常简单,并且与平台无关。这意味着您可以直接跳到下面的构建/编译步骤,因为提供的内容Makefile
可以在任何系统上使用。
一个例子
在本教程中,我将使用名为Newsbeuter的基于文本的RSS阅读器作为构建应用程序时可能遇到的错误类型的示例。对于Newsbeuter,配置脚本的名称为config.sh
。在我的系统上,当我运行时config.sh
,会发生以下错误:
tester@sitlabcpu22:~/download/newsbeuter-1.3$ ./config.sh
Checking for package sqlite3... not found
You need package sqlite3 in order to compile this program.
Please make sure it is installed.
经过研究,我发现实际上sqlite3
已经安装了该应用程序。但是,由于我正在尝试从源代码构建,因此这是一个提示,config.sh
实际上是在寻找针对的开发库(标头)sqlite3
。在Ubuntu中,大多数软件包都有一个以结尾的关联开发对应软件包-dev
。(其他平台,例如Fedora,通常使用软件包后缀-devel
作为开发包。)
要为sqlite3
开发包找到合适的包,我们可以使用apt-cache
Ubuntu中的实用程序(以及类似的yum
Fedora中的实用程序):
tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite
该命令返回了大量结果,因此我们必须做一些侦探工作才能确定哪个是合适的软件包。在这种情况下,适当的软件包为libsqlite3-dev
。请注意,有时我们要查找的软件包将带有lib
前缀,而不仅仅是相同的软件包名称plus -dev
。这是因为有时我们只是在寻找可以被许多不同应用程序使用的共享库。要安装libsqlite3-dev
,请在终端中运行典型的apt-get install命令:
tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev
现在,我们必须config.sh
再次运行以确保我们已经解决了该依赖关系问题,并且没有其他依赖关系问题。(虽然在这里我不会显示,但对于Newsbeuter,我也必须安装该libcurl4-openssl-dev
软件包。)此外,如果您安装了开发软件包(如libsqlite3-dev
),而相关的应用程序软件包(如sqlite3
)则没有已经安装的大多数系统将同时自动安装关联的应用程序包。
配置成功运行后,结果将是创建一个或多个make文件。这些文件通常被命名Makefile
(请记住,文件名大小写在Unix / Linux中很重要!)。如果构建包包含子目录(例如src
)等,则这些子目录中的每个子目录也将包含一个Makefile
。
编译和编译错误
现在,我们准备好实际编译应用程序了。通常将其称为“建筑”,而该名称是从现实中构建建筑的过程中借用的。应用程序的各个“部分”(通常是多个源代码文件)被组合在一起以形成整个应用程序。make实用程序管理构建过程,并调用其他应用程序(例如编译器和链接器)实际完成工作。在大多数情况下,您只需从运行配置的目录中运行make(使用普通用户帐户)。(在某些情况下,例如编译使用Qt库编写的应用程序,您将需要运行另一个“包装”应用程序,例如qmake。同样,请始终检查README
和/或INSTALL
文档以了解详细信息。)
与上面的配置脚本一样,当您在终端中运行make(或类似的实用程序)时,它将显示一些有关正在执行的消息以及所有警告和错误。通常,您可以忽略警告,因为它们主要针对应用程序开发人员,并且告诉他们某些标准行为被违反。通常,这些警告不会影响应用程序功能。另一方面,必须处理编译器错误。使用Newsbeuter,当我运行make时,一切都进行了一段时间,但随后出现错误:
tester@sitlabcpu22:~/download/newsbeuter-1.3$ make
...
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/configparser.o -c src/configparser.cpp
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/colormanager.o -c src/colormanager.cpp
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:5:18: error: stfl.h: No such file or directory
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:33: error: ISO C++ forbids declaration of \u2018stfl_form\u2019 with no type
./include/stflpp.h:33: error: expected \u2018;\u2019 before \u2018*\u2019 token
./include/stflpp.h:34: error: ISO C++ forbids declaration of \u2018stfl_ipool\u2019 with no type
./include/stflpp.h:34: error: expected \u2018;\u2019 before \u2018*\u2019 token
make: *** [src/colormanager.o] Error 1
遇到第一个错误时,make过程将立即停止。处理编译器错误有时可能很棘手。您必须查看错误以获取有关该问题的一些线索。通常,问题是缺少一些通常具有.h
或扩展名的头文件.hpp
。在上述错误的情况下,很明显(或应该是!)问题是stfl.h
找不到头文件。如本例所示,您想查看错误消息的第一行,然后逐步查找问题的根本原因。
看完Newsbeuter文档(我应该在开始之前就应该做的,但是本教程的这一部分并没有什么意义!),我发现它需要一个名为STFL的第三方库。那么在这种情况下我们该怎么办?好吧,我们实际上对所需的库重复了相同的过程:获取该库并为其执行configure-build-install过程,然后继续构建所需的应用程序。例如,对于STFL,我必须安装libncursesw5-dev
软件包才能正确构建。(通常,在安装另一个必需的应用程序后,不必在原始应用程序上重做配置步骤,但也不会造成任何伤害。)
成功安装STFL工具包后,Newsbeuter的制作过程成功运行。生成过程通常会在中断的地方(错误发生时)进行处理。因此,任何已成功编译的文件都不会重新编译。如果要重新编译所有内容,可以运行make clean all删除所有已编译的对象,然后再次运行make。
正在安装
构建过程成功完成后,即可准备安装该应用程序。在大多数情况下,要将应用程序安装到文件系统的公共区域(例如,/usr/bin
或/usr/share/bin
等),您将需要以root用户身份运行安装。安装实际上是整个过程中最简单的步骤。要安装,请在终端中运行:
$ make install
检查此过程的输出是否有任何错误。如果一切成功,则应该能够在终端中运行命令名称,它将启动。(如果是GUI应用程序,则在命令行的末尾加上&,否则,直到该应用程序完成运行后,您才能使用终端会话。)
从源代码构建应用程序时,通常不会在Ubuntu中向GUI菜单添加图标或快捷方式。您将需要手动添加。
从本质上讲,这就是从Ubuntu中构建和安装应用程序的过程,尽管可能需要迭代。完成几次后,它将成为您的第二天性!