故障排除 ./configure、make 和 make install 教程
2023-06-08 08:00:00
·
飞浪
·
詹姆斯
有时,编译程序的典型顺序不起作用。那该怎么办?了解如何消除典型 Linux 编译顺序中经常发生的许多错误。
有时,编译程序的典型顺序不起作用。它开始吐出各种错误,似乎什么都做,就是编译那个烦人的程序。那该怎么办?本教程介绍如何摆脱典型 Linux 编译顺序中经常发生的许多错误。注意:只有在真正需要时才应该编译软件。编译可能会危及您的 Linux 安装。如果您要安装某些软件,请先查找预编译的包(如 .rpm 或 .deb)。如果您确实需要编译,请小心进行。注意:本教程假设您具有一些 Linux 命令行知识,并且知道如何使用发行版的包管理器。我们可以将错误分为三类:
如何识别它们应该很明显:./configure 错误由 configure 脚本输出,make 错误由 make 命令输出,等等。现在我将列出这三类中的常见错误及其解决方案。
以下列表包含 ./configure 可能给出的一些常见错误,按出现频率排序。第一个是出现次数最多的。( 和 ) 之间的内容是可选的,它们并不总是出现。粗体斜体 OR 表示多个错误有相同的解决方案。< 和 > 之间的文本描述了应该出现在该位置的字符串类型。
- (configure:) (error:) <somename> (<someversion> (或更高版本)) 未找到。(请检查您的安装!)或检查 <somename>... (configure:) (error:) 未找到。或(configure:) (error:) <somename> (<someversion> (或更高版本)) 是构建 <package-you're-trying-to-compile> 所必需的。
- 这通常意味着您的计算机上未安装名为 <somename> 的软件包的 -dev 或 -devel 版本。请使用您的发行版的软件包管理器(或任何其他查找和安装软件包的方法)来搜索 <somename> 并安装(如果可能)-dev 或 -devel 版本。如果 -dev 或 -devel 版本已安装或者不存在,请查看当前安装的版本号。它足够高吗?如果它低于 <someversion>(如果适用),请尝试升级软件包。如果这对您来说不是一个选择,您还可以尝试编译您正在尝试编译的软件包的旧版本。旧版本通常使用它们所依赖的库/程序的早期版本。如果 ./configure 找不到的软件包是一个库(通常用软件包名称 lib<something> 表示),并且您确定安装了正确的版本,请尝试查找库文件所在的位置。如果此目录未包含在您的 ld conf 文件中(通常位于 /etc/ld.conf 或 /etc/ld.so.conf),您应该添加它,然后运行 ldconfig(通常位于 /sbin/ldconfig)。请注意,ldconfig 通常应以 root 权限执行。如果您不知道如何执行此操作,请查看Make install 错误的第一点。注意:如果您无权访问 ld conf 文件,您还可以将目录添加到 LD_LIBRARY_PATH 变量中。这非常丑陋并且不是最佳做法,但有时您没有其他选择。您可以通过以下方式将目录添加到 LD_LIBRARY_PATH:
[rechosen@localhost ~]$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/你的/library/目录"
当然,请将 /your/library/directory 替换为您适用的目录。请注意,在运行您编译的程序时,LD_LIBRARY_PATH 也必须包含 /your/library/directory。
- (配置:) (错误:) 找不到标题 (文件) <somename>.h或(配置:) (错误:) (标题) (文件) <somename>.h 缺失!或<类似>
- 配置脚本找不到编译所需的 .h 文件。此错误与上述错误类似,因为它要求您安装某个软件包的 -dev 或 -devel 版本。但是,通常不太清楚应该安装哪个软件包,因为 <somename> 可能是一个非常通用的名称。尝试在网上搜索 <somename>.h 以找出它属于哪个软件包,然后尝试使用发行版的软件包管理器安装该软件包(包括其 -dev 或 -devel 版本,如果有)。
- (配置:)(错误:)在 <somedirectories> 中未找到可接受的 cc
- 您的 gcc 安装缺失或未设置 CC 环境变量。使用发行版的包管理器检查包 gcc 是否已安装。如果没有,请安装它。但是,如果已安装,请尝试使用此命令:
[rechosen@localhost ~]$ 导出 CC="/usr/bin/cc"
如果有效,您可以将该命令添加到您的 /etc/profile(一个包含任何用户登录时执行的命令的文件),这样您就不必再次设置它。
- (配置:)(错误:)C++ 预处理器“/lib/cpp”未通过健全性检查
- 您的 g++ 软件包缺失或损坏。请使用您的发行版的软件包管理器(或任何其他查找和安装软件包的方法)搜索 g++ 并安装相应的软件包。请注意,相当多的发行版不将软件包称为 g++。例如,Fedora 在其 yum 存储库中使用软件包名称 gcc-c++。如果您找不到 g++,请尝试搜索 c++、cpp 和/或 gcc。
- (配置:)(错误:)C++ 预处理器“CC (-E)”未通过健全性检查
- 这是由 libtool 某些版本中的一个奇怪错误引起的,该错误使 configure 脚本检查 libtool 支持的所有编译器。最快的解决方案是安装 g++(请参阅上面的解决方案)。
由于 make 错误通常过于具体,无法列出一个通用的列表,因此我将为您提供一个可能有帮助的常规操作列表:
- 如果您使用 gcc 4 进行编译(使用 gcc -dumpversion 查找),请尝试使用较旧的编译器版本。首先,确保已安装某个较旧的版本。通常可以通过以下方式检测:
[rechosen@localhost ~]$ ls /usr/bin/gcc*
如果返回如下内容:
/usr/bin/gcc /usr/bin/gcc32
然后,在本例中,您可以使用 gcc32 命令来编译较旧的 gcc 版本。如果没有,请尝试使用发行版的包管理器来搜索较旧的 gcc 版本(通常称为 compat-gcc 或 gcc-<versionnumber>)。安装后,您应该能够使用上面的 ls 命令检测到替代的 gcc 版本。以如下方式告诉 ./configure、make 和 make install 序列使用较旧的 gcc 版本:
[rechosen@localhost ~]$ CC="/usr/bin/gcc32" ./configure[rechosen@localhost ~]$ CC="/usr/bin/gcc32" make[rechosen@localhost ~]$ CC="/usr/bin/gcc32" make install
注意:在大多数情况下,您可以忽略 /usr/bin,只输入 gcc 可执行文件名称。但是,某些非标准 Makefile 可能会以不同的方式处理它。因此,包含完整路径是最安全的选择。当然,将 /usr/bin/gcc32 替换为您的替代 gcc 命令的位置。
- 有时 make 错误只是由一个普通的错误引起的。尝试获取软件的最新开发版本(使用其 cvs、svn 或类似存储库,或下载夜间快照)并尝试编译该版本,看看他们是否修复了那里的错误。
- 某些库/程序的版本错误也会导致 Make 错误。尤其是非常新和非常旧的软件包都存在这个问题。查看软件包的依赖项(它们通常在软件站点的某个地方列出),并将那里的版本号与您自己的计算机上的版本号进行比较(通常可以使用发行版的软件包管理器的搜索功能找到它们)。如果您系统上的版本号远高于软件包站点上的版本号,则您可能正在尝试编译一个非常旧的软件包。如果您确实需要编译它,请尝试降级依赖项。但是,通常更好的选择是搜索其他方法来安装软件包或寻找替代方案。如果您系统上的版本号远低于软件包站点上的版本号,则您要么正在尝试编译一个前沿软件包,要么您的发行版很旧,或者两者兼而有之 =)。您可以尝试更新所需的库/程序或编译程序的旧版本。此外,看看是否存在为您的程序发行版制作的不错的软件包。安装这样的包通常比尝试处理编译错误更容易。
- 另一个可以尝试的方法是在网络上搜索特定错误。如果找不到任何有用的东西,请尝试删除行号(它们会随着版本而变化)、版本号(如果它们包含在(文件)名称中,您可以用星号替换它们)和非字母数字字符(如引号),因为它们会影响搜索引擎的搜索。您通常可以在邮件列表上找到很多信息。有时,会提供可以修复源代码的补丁。补丁可以这样应用:
[rechosen@localhost ~]$ patch -Np1 -i <补丁文件>
请注意,您需要进入源目录才能应用补丁。
这些错误通常很容易理解,但我还是会记录下来。有两个常见原因会阻止您成功使用 make install:
- 您没有 root 权限。尝试使用 sudo 运行 make install 或尝试使用 su 成为 root。Sudo 应按如下方式使用:
[rechosen@localhost ~]$ sudo make install
它会要求输入密码;这通常是您自己的密码或系统 root 密码。您可以使用 su 以这样的方式成为 root:
[rechosen@localhost ~]$ su
此命令也会要求输入密码,但密码始终是系统 root 密码。成为 root 后,只需像平常一样运行 make install。之后,如果您使用了 su,请不要忘记再次返回到普通用户。您可以按 Ctrl + D 执行此操作,如果此操作不起作用,请输入“exit”或“logout”,然后按 Enter。但是,仅当您使用 su成为root 时才建议这样做。sudo 程序仅以 root 权限运行命令,它不会让您以 root 身份登录。
- 您刚刚编译的软件包没有安装目标。在这种情况下,您必须自己将编译后的二进制文件复制到 bin 目录。如果您在源目录中执行 ls,可执行文件应显示为浅绿色。这些文件可以复制到 /usr/bin(或 /usr/local/bin,如果您愿意)的方式如下:
[rechosen@localhost ~]$ cp <可执行文件> /usr/bin
但是,如果使用过多,/usr 目录会变得一团糟。您还可以将可执行文件所在的目录添加到 PATH 变量中。转到目录,通过以下方式获取其完整路径:
[rechosen@localhost ~]$ pwd
然后将 pwd 的输出粘贴到此命令中:
[rechosen@localhost ~]$ 导出 PATH="$PATH:<pwdoutput>"
如果您现在可以运行该命令,则说明它有效。将您运行的导出命令添加到您的 /etc/profile,这样您就不必再次输入它。我同意这不是一种干净简单的方法,但有时开发人员不会花时间创建(正确的)安装目标。我们不应该生他们的气:想想他们所做的所有工作,让我们享受有用和/或有趣的程序 =)。
以下列出了其他一些常见问题及其解决方案:
- 一切正常,但当我输入刚刚安装的命令时,bash 说找不到它。这通常是由于 make install 在 /usr/local 或 /opt/<packagename> 中安装所有内容造成的。查看 make install 的输出:它将文件复制到哪里了?尝试将该位置的 bin 目录添加到您的 PATH 变量中(以下示例假设软件包安装到 /usr/local):
[rechosen@localhost ~]$ 导出 PATH="$PATH:/usr/local/bin"
您只需将 /usr/local/bin 替换为安装软件包可执行文件的 bin 目录即可。如果可行,请将这一行添加到 /etc/profile 中,这样您就不必一遍又一遍地输入这些内容。顺便说一句,您可以通过在运行 configure 脚本时指定此选项来控制软件包的安装位置:
[rechosen@localhost ~]$ ./configure --prefix=/usr
如果需要,请将 /usr 替换为要安装软件包的目录。请注意,您只设置了前缀;二进制文件将安装在前缀的子目录中,就像库、头文件等一样。例如,当使用上述前缀时,您将在 /usr/bin 中找到二进制文件。
- 我想安装一个非常老版本的软件包,但我在互联网上找不到它的源存档。你仍然有一点机会。尝试搜索你想要的版本的 rpm 并下载相应的 src rpm。用这种方式解压:
[rechosen@localhost ~]$ rpm2cpio <rpm文件> | cpio-idv
现在,使用应该从源 rpm 中提取的源文件。
本教程尚未完成。我计划不时更新它,以解决用户请求的问题。因此,我请您评论它并说出您希望在其中看到的内容。请记住,本教程是关于通用故障排除的。不要问我如何编译某个程序的某个版本。无论如何,我希望本教程对您有用。感谢您的阅读,祝您在编译这个极其复杂的事情上好运!
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~