【问题标题】:How to install latest glibc (version 2.29) beside system installed one & compile a program?如何在已安装系统的旁边安装最新的 glibc(2.29 版)并编译程序?
【发布时间】:2019-07-06 08:48:03
【问题描述】:

基于此Stackoverflow 链接,我在 Linux 操作系统的“/usr/local/glibc”路径中下载并安装了 glibc v2.29。然后基于此Stackoverflow 链接,我尝试编译此Example,但出现以下错误。
首次尝试命令:

gcc -Wall -g -o main main.c -Wl,--rpath=/usr/local/glibc/lib -Wl,--dynamic-linker=/usr/local/glibc/lib/ld-linux -x86-64.so.2

首次尝试错误日志:

main.c:1:10: fatal error: threads.h: No such file or directory
#include <threads.h>
         ^~~~~~~~~~~
compilation terminated.

第二次尝试命令: 在第二次尝试中,我使用 "-I" & "-L" GCC 命令选项。

gcc -Wall -g -I/usr/local/glibc/include -o main main.c -L/usr/local/glibc/lib -Wl,--rpath=/usr/local/glibc/lib - wl,--dynamic-linker=/usr/local/glibc/lib/ld-linux-x86-64.so.2

第二次尝试错误日志:

/tmp/ccCNYemW.o: In function `main':
/home/.../main.c:14: undefined reference to `thrd_create'
/home/.../main.c:16: undefined reference to `thrd_join'
collect2: error: ld returned 1 exit status

所以我不知道问题出在哪里。请帮帮我。

【问题讨论】:

  • 第二次尝试是否应该有-Wl,-lthread或类似于线程库中的链接?
  • 什么是“-lthread”? “-lthread”的正确值是多少?我主要用 GO 编写程序,现在尝试学习 c,因为我也喜欢 C。
  • 构建和安装替代 glibc 并不难,但实际上使用它可能非常麻烦,尤其是因为在基于 glibc 的系统中,几乎所有工具和其他整个系统中的库依赖于glibc。
  • 抱歉没有意识到 thrd_create ... 来自 libc。您可以尝试安装到 docker 容器中
  • 您确定您机器上的glibc 2.29 带有thrd_create 吗?你能检查/usr/local/glibc/lib/libc.so.6 是否启用了符号?您可能对 gcc 的 --sysroot 选项更感兴趣,或者只是创建一个 chroot。

标签: c glibc


【解决方案1】:

首先,不要将备用 libc(或您的 libc 的备用版本)放在主系统的正常包含和库搜索(链接时和运行时库搜索)搜索的路径中。这是灾难的秘诀。在/usr/local/ 中安装不同的 glibc 确实可以避免破坏您的系统,但现在您只需将两个安装在相同工具可以查看和使用它们的地方。

要正确执行此操作,您确实需要一个完全独立的工具链(gcc、binutils),位于某个完全独立的路径中(如~/my_glibc_root/.../opt/alt_glibc_root/...)。我不确定是否有推荐的方法来做到这一点。 Linux From Scratch 中的 glibc 构建过程可能是寻找想法的好地方。理论上它可以在一个阶段完成;我在musl-cross-make 中通过仔细使用gcc 构建系统中的中间make 规则来使用musl libc 来做到这一点。但是将相同的想法应用到 glibc 可能需要格外小心。

【讨论】:

  • gcc 搜索库的默认位置是什么?
  • 这次我在“/opt/glibc”中安装了glibc,但这也不起作用。
【解决方案2】:

第二次尝试命令:在第二次尝试中,我使用“-I”和“-L”GCC 命令选项。

gcc -Wall -g -I/usr/local/glibc/include -o main main.c -L/usr/local/glibc/lib -Wl,--rpath=/usr/local/glibc/lib -Wl,--dynamic-linker=/usr/local/glibc/lib/ld-linux-x86-64.so.2

这个命令几乎是正确的。 thrd_createthrd_join 函数在 libpthread 中定义,您没有链接它们。

在你的编译命令中添加-pthread,链接应该会成功。

附: R 建议不要将备用 GLIBC 安装到 /usr/local 中也是一个很好的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2015-03-31
    • 2014-06-03
    • 1970-01-01
    相关资源
    最近更新 更多