如果 xmkmf 和/或 make 成功执行且没有错误,您可以继续下一节。然而,在“现实生活中”,很少有事情第一次就能顺利完成。这时就需要考验您的应变能力了。
Link error: -lX11: No such file or directory
错误。这可能意味着 Imake 文件没有正确设置。检查 Makefile 文件的开头部分,查找如下行:
LIB= -L/usr/X11/lib
INCLUDE= -I/usr/X11/include/X11
LIBS= -lX11 -lc -lm
-L
和 -I
开关分别告诉编译器和链接器在哪里查找库文件和头文件。在本例中,X11 库应该在 /usr/X11/lib
目录中,而 X11 头文件应该在 /usr/X11/include/X11
目录中。如果这对您的机器不正确,请对 Makefile 进行必要的更改,然后再次尝试 make。
/tmp/cca011551.o(.text+0x11): undefined reference to `cos'
解决此问题的方法是显式链接 math library
,方法是在 Makefile
中的 LIB 或 LIBS 标志中添加 -lm(请参见前面的示例)。
make -DUseInstalled -I/usr/X386/lib/X11/config
这是 xmkmf 的一种简化等效形式。
# ldconfig 更新共享库符号链接。 这可能不是必要的。
Makefile
使用您系统中存在的库的无法识别的别名。例如,构建可能需要 libX11.so.6
,但在 /usr/X11R6/lib
中不存在这样的文件或链接。但是,存在 libX11.so.6.1
。解决方案是以 root 身份执行 ln -s /usr/X11R6/lib/libX11.so.6.1 /usr/X11R6/lib/libX11.so.6。这可能需要随后执行 ldconfig。
R5 库
被命名为 libX11.so.3.1.0
、libXaw.so.3.1.0
和 libXt.so.3.1.0
。您通常需要链接,例如 libX11.so.3 -> libX11.so.3.1.0。可能软件还需要 libX11.so -> libX11.so.3.1.0 形式的链接。当然,要创建“缺失”的链接,请使用命令 ln -s libX11.so.3.1.0 libX11.so,以 root 身份。
libc
版本 5.4.4 或更高版本而臭名昭著。即使是较新的 StarOffice 5.0 在使用新的 glibc 2.1
库安装后也无法运行。幸运的是,较新的 StarOffice 5.1 解决了这些问题。如果运行旧版本的 StarOffice,您需要以 root 身份将一个或多个库复制到相应的目录,删除旧库,然后重置符号链接(有关此方面的更多信息,请查看最新版本的 StarOffice miniHOWTO
)。警告:对此操作务必格外小心,因为如果您搞砸了,可能会导致系统无法正常运行。您通常可以在 Sunsite 上找到最新的更新库。
No such file or directory
错误消息。在这种情况下,检查文件权限以确保文件是可执行的,并检查文件头以确定脚本调用的 shell 或程序是否在指定的位置。例如,脚本可能以以下内容开头:
#!/usr/local/bin/perl
如果 Perl 实际上安装在您的 /usr/bin
目录而不是 /usr/local/bin
目录中,则脚本将无法运行。有两种方法可以纠正此问题。可以将脚本文件头更改为 #!/usr/bin/perl
,或者可以添加指向正确目录的符号链接,ln -s /usr/bin/perl /usr/local/bin/perl。
当软件包需要您的系统上不存在的库进行构建时,将导致链接错误(undefined reference
错误)。这些库可能是昂贵的专有库,或者由于其他原因难以找到。在这种情况下,从软件包的作者或 Linux 用户组获取静态链接的二进制文件可能是最容易实现的解决方案。
libc 5
库更改为 libc 6 / glibc 2
库。使用旧库的预编译二进制文件在您升级库后可能会崩溃。解决方案是从源代码重新编译应用程序,或获取较新的预编译二进制文件。如果您正在将系统升级到 libc 6
并且遇到问题,请参阅 Eric Green 的 Glibc 2 HOWTO。
请注意,glibc
版本之间存在一些小的兼容性问题,因此使用 glibc 2.1
构建的二进制文件可能无法与 glibc 2.0
一起使用,反之亦然。
Makefile
中的编译标志中删除 -ansi 选项。这会启用 gcc 的额外的、非 ANSI 功能,并允许构建需要这些扩展的软件包。(感谢 Sebastien Blondeel 指出这一点。)
警告:具有 setuid root 的程序可能会对您的系统构成安全风险。该程序以 root 权限运行,因此有可能造成重大损害。在设置 setuid 位之前,请务必了解程序的功能,如果可能,请查看源代码。
您可能希望检查 Makefile
以确保为您的系统调用了最佳编译选项。例如,设置 -O2 标志选择最高级别的优化,而 -fomit-frame-pointer 标志会导致二进制文件更小(尽管调试将被禁用)。除非您知道自己在做什么,否则不要随意修改此项,并且在任何情况下,都不要在试用 build 工作之后进行修改。
根据我的经验,大约 25% 的应用程序可以“开箱即用”地构建。另外大约 50% 可以通过从微不足道到非常艰巨的努力“说服”构建。但这仍然意味着相当多的软件包无论如何都无法构建。即使那样,也可能在 Sunsite 或 TSX-11 存档中找到这些软件包的 Intel ELF
和/或 a.out
二进制文件。Red Hat 和 Debian 拥有大多数流行的 Linux 软件的预打包二进制文件的广泛存档。也许软件的作者可以提供为您的特定机器风格编译的二进制文件。
请注意,如果您获得预编译的二进制文件,您需要检查与您的系统的兼容性
二进制文件必须在您的硬件上运行(即,Intel x86)。
二进制文件必须与您的内核兼容(即,a.out 或 ELF)。
您的库必须是最新的。
您的系统必须具有相应的安装实用程序(rpm 或 deb)
.如果所有其他方法都失败了,您可以在适当的新闻组中找到帮助,例如 comp.os.linux.x 或 comp.os.linux.development。
如果一切都行不通,至少您尽了最大努力,并且学到了很多东西。