【问题标题】:Error During Compilation of GNU C Library (glibc)编译 GNU C 库 (glibc) 时出错
【发布时间】:2014-03-07 22:31:21
【问题描述】:

我没有系统管理方面的经验,也没有编译基于 C 的程序的技术细节,如果我说的不准确,请多多包涵。

基本上,我使用的计算集群具有相对较旧的操作系统(Red Hat Enterprise Linux 4.3,从 ~2006 年开始),我没有 root 访问权限。我在编译各种程序时经常遇到问题。我能看到的一个常见原因是库过时,尤其是 C 库。我决定编译glibc 的最新版本,认为链接到这个新的 C 库可以解决我的许多问题(这听起来不错?)。这使我陷入了安装gcc 及其依赖项(包括现代Linux 内核头文件)的更新版本的兔子洞。

无论如何,我相信我有一个工作版本的gcc。现在,当我尝试使用这个新的gcc 编译glibc 时,我在编译过程中遇到了一个错误,如下(这些是最后几行):

[...]
make[2]: Leaving directory `/home/bgrande/software/apollo/src/glibc-2.19/login'
make  subdir=elf -C elf ..=../ subdir_lib
make[2]: Entering directory `/home/bgrande/software/apollo/src/glibc-2.19/elf'
Makefile:896: *** target `.dyn' leaves prerequisite pattern empty.  Stop.
make[2]: Leaving directory `/home/bgrande/software/apollo/src/glibc-2.19/elf'
make[1]: *** [elf/subdir_lib] Error 2
make[1]: Leaving directory `/home/bgrande/software/apollo/src/glibc-2.19'
make: *** [all] Error 2    

我不知道是什么

Makefile:896: *** target `.dyn' leaves prerequisite pattern empty.  Stop.

意味着,更重要的是,什么可以解决这个问题。谷歌和 Stack Overflow 搜索没有出现任何结果。

我知道这可能与我的系统环境有关,尽管我不知道具体是什么。如果我可以提供可以提供帮助的其他信息,请告诉我。我会很感激一个解决方案,但也是解决方案的基本原理,也许是一种解释错误以供将来参考的方式。谢谢!

更新:根据@andrewdotn 的建议安装更新版本的 Make (make-4.0) 确实解决了该错误,但在编译后会出现另一个错误(见下文)。有任何想法吗?

[...]
/home/bgrande/software/apollo/glibc-2.19/resolv/libresolv_pic.a(ns_print.os): In function `__GI_ns_sprintrrf':
/home/bgrande/software/apollo/src/glibc-2.19/resolv/ns_print.c:99: undefined reference to `__stack_chk_guard'
/home/bgrande/software/apollo/src/glibc-2.19/resolv/ns_print.c:728: undefined reference to `__stack_chk_guard'
/home/bgrande/software/apollo/glibc-2.19/resolv/libresolv_pic.a(gethnamaddr.os): In function `getanswer':
/home/bgrande/software/apollo/src/glibc-2.19/resolv/gethnamaddr.c:180: undefined reference to `__stack_chk_guard'
/home/bgrande/software/apollo/src/glibc-2.19/resolv/gethnamaddr.c:483: undefined reference to `__stack_chk_guard'
/home/bgrande/software/apollo/glibc-2.19/resolv/libresolv_pic.a(gethnamaddr.os): In function `__GI_res_gethostbyname2':
/home/bgrande/software/apollo/src/glibc-2.19/resolv/gethnamaddr.c:510: undefined reference to `__stack_chk_guard'
/home/bgrande/software/apollo/glibc-2.19/resolv/libresolv_pic.a(gethnamaddr.os):/home/bgrande/software/apollo/src/glibc-2.19/resolv/gethnamaddr.c:636: more undefined references to `__stack_chk_guard' follow
collect2: error: ld returned 1 exit status
../Makerules:438: recipe for target '/home/bgrande/software/apollo/glibc-2.19/resolv/libresolv.so' failed
make[2]: *** [/home/bgrande/software/apollo/glibc-2.19/resolv/libresolv.so] Error 1
make[2]: Leaving directory '/home/bgrande/software/apollo/src/glibc-2.19/resolv'
Makefile:213: recipe for target 'resolv/others' failed
make[1]: *** [resolv/others] Error 2
make[1]: Leaving directory '/home/bgrande/software/apollo/src/glibc-2.19'
make: *** [all] Error 2

【问题讨论】:

  • C 代码不应该受到旧工具链的太大影响,C++ 是另一个星系......原生工具链有什么不适用的?在任何情况下,编译新的 GCC 和整个 shebang 都会非常痛苦……而且更改 glibc 比升级到最新的 RHEL 更具侵入性……
  • 您也许可以安装现代 Linux 内核头文件,但它们只会给您带来伤害而不是好处。您正在运行的实际内核必须与标头匹配。
  • 至于你得到的错误,你的 Makefile 在第 896 行或附近被破坏(语法无效)。很难说出原因或如何解决这个问题,至少看不到一部分在第 896 行附近的那个 Makefile 中(但即使这样我也怀疑它,可能需要整个上下文)。
  • 你试过MUSL libc吗?它可以满足您的需求并且更容易构建......
  • 把更新放到一个单独的问题中。

标签: linux gcc makefile glibc


【解决方案1】:

这听起来像是由旧版本的 Make 引起的。 RHEL 4.3 使用 2002 年的 Make 3.80。尝试下载 Make 3.82 or 4.0 from ftp.gnu.org,在您的主目录中构建它,然后使用它来驱动编译。

【讨论】:

  • 我安装了make-4.0,这让我通过了我曾经得到错误的地方。不幸的是,我现在在此过程的后期遇到了另一个错误。请参阅上面的更新。
猜你喜欢
  • 2011-07-12
  • 2017-12-02
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2013-09-15
  • 2021-10-17
相关资源
最近更新 更多