基于这个堆栈过流链接,我在Linux的"/usr/local/glibc“路径中下载和安装了glibc v2.29。然后,基于这个堆栈过流链接,我试图编译这个示例,但是我得到了以下错误。
第一次尝试命令:
gcc --dynamic-linker=/usr/local/glibc/lib/ld-linux-x86-64.so.2 -Wall -g -o main.c -Wl,-rpath=/usr/local/glibc/lib -Wl,
首次尝试错误日志:
main.c:1:10: fatal error: threads.h: No such file or directory
#include <threads.h>
^~~~~~~~~~~
compilation terminated.第二次尝试命令:在第二次尝试中,我使用"-I" & "-L" GCC命令选项。
gcc --dynamic-linker=/usr/local/glibc/lib/ld-linux-x86-64.so.2 -Wall -g -I/usr/local/glibc/include -o main.l/usr/local/glibc/lib -Wl,-rpath=/usr/local/glibc/lib -Wl,
第二次尝试错误日志:
/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所以我不知道问题出在哪里。请帮帮我。
发布于 2019-02-12 16:42:05
首先,不要将替代的libc (或libc的替代版本)放在普通包含和库搜索(链接时间和运行时库搜索)搜索的主系统路径中。这是灾难的秘诀。在/usr/local/中安装不同的glibc确实避免了系统的崩溃,但是现在您只在相同的工具可以看到和使用它们的地方安装了两个。
要做到这一点,您确实需要一个完全独立的工具链(gcc,binutils)在完全独立的路径中(如~/my_glibc_root/...或/opt/alt_glibc_root/...)。我不确定是否有推荐的方法。在Linux中从头开始使用glibc构建过程可能是一个寻找想法的好地方。理论上,它可以在一个阶段内完成,我在musl-交叉制造中使用musl,通过在gcc构建系统中仔细使用中间生成规则来实现。但是将同样的想法应用于glibc可能需要额外的注意。
发布于 2019-02-16 18:53:56
第二次尝试命令:在第二次尝试中,我使用"-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_create和thrd_join函数是在libpthread中定义的,您没有对它们进行链接。
将-pthread添加到编译命令中,链接就会成功。
P.S.R.关于不要在/usr/local中安装替代GLIBC的建议也是一个不错的建议。
https://stackoverflow.com/questions/54654603
复制相似问题