基于此Stackoverflow链接,我下载了 glibc v2.29 并将其安装在Linux OS的“ / usr / local / glibc”路径中。然后,基于这个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
所以我不知道问题出在哪里。请帮助我。
答案 0 :(得分:3)
首先,不要在主系统的常规包含和库搜索(链接时和运行时库搜索)搜索的路径中放置备用libc(或libc的备用版本)。这是灾难的秘诀。在/usr/local/
中安装不同的glibc确实避免了破坏您的系统,但是现在您只在可以看到和使用相同工具的地方安装了两个。
要正确执行此操作,您确实确实需要在某些完全独立的路径(例如~/my_glibc_root/...
或/opt/alt_glibc_root/...
)中使用完整的单独工具链(gcc,binutils)。我不确定是否有推荐的方法可以做到这一点。 Linux From Scratch中的glibc构建过程可能是寻找想法的好地方。理论上,它可以在单个阶段完成。我使用musl-cross-make中的musl libc来做到这一点,是通过谨慎地使用gcc构建系统中的中间make规则。但是将相同的想法应用于glibc可能需要格外小心。
答案 1 :(得分:0)
第二次尝试命令:在第二次尝试中,我正在使用“ -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,这也是一个很好的建议。