【问题标题】:"fatal error: bits/libc-header-start.h: No such file or directory" while compiling HTK编译 HTK 时出现“致命错误:bits/libc-header-start.h:没有这样的文件或目录”
【发布时间】:2019-06-02 14:15:49
【问题描述】:

尝试在HTK library 上运行make 时遇到以下问题:

(cd HTKLib && make HTKLib.a) \
  || case "" in *k*) fail=yes;; *) exit 1;; esac;
make[1]: Entering directory '/home/william/speech/htk/HTK-3.4.1/htk/HTKLib'
gcc  -m32 -ansi -D_SVID_SOURCE -DOSS_AUDIO -D'ARCH="x86_64"' -Wall -Wno-switch -g -O2 -I. -DPHNALG   -c -o HGraf.o HGraf.c
In file included from HShell.h:40:0,
                 from HGraf.c:54:
/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory
 #include <bits/libc-header-start.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
<builtin>: recipe for target 'HGraf.o' failed
make[1]: *** [HGraf.o] Error 1
make[1]: Leaving directory '/home/william/speech/htk/HTK-3.4.1/htk/HTKLib'
Makefile:96: recipe for target 'HTKLib/HTKLib.a' failed
make: *** [HTKLib/HTKLib.a] Error 1

我不确定如何处理此错误。 libc-header-start.h 文件存在于我的系统中:

$ find /usr -name libc-header-start.h
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h

运行gcc -H -fsyntax-only /usr/include/stdio.h 适当返回

. /usr/include/x86_64-linux-gnu/bits/libc-header-start.h
.. /usr/include/features.h
... /usr/include/x86_64-linux-gnu/sys/cdefs.h

等等

此外,编译和运行健全性检查 C 文件也可以正常工作(只需在其 main 方法中执行 printf("hello!");)。

如果这是一个众所周知的错误,我们深表歉意 - 我对 C 库的体验仅限于使用 make 编译和安装它们。

更新 根据下面接受的答案,我执行了sudo apt-get install gcc-multilib 来安装缺少的 32 位库。

之后我收到了一个类似原因的错误:"/usr/bin/ld: cannot find -lX11" error when installing htk。我通过执行sudo apt-get install libx11-dev:i386 libx11-dev 来检索丢失的 32 位库解决了这个问题。

【问题讨论】:

  • 这是 64 位还是 32 位系统? (即uname -a的输出是什么?)
  • 您显示的 gcc 调用是 gcc -m32,它告诉 gcc 编译 32 位二进制文​​件。为此,它不会在 /usr/include/x86_64-linux-gnu/ 中查找头文件,因为该目录(正如其名称所暗示的)包含 64 位构建的头文件。

标签: c makefile htk


【解决方案1】:

-m32 告诉 gcc 为 32 位平台编译。在 64 位机器上,gcc 通常只附带 64 位库。你有两个选择:

  1. 安装 32 位头文件和库。以下是在 Ubuntu 上执行此操作的方法:https://askubuntu.com/questions/91909/trouble-compiling-a-32-bit-binary-on-a-64-bit-machine
  2. 改为编译为 64 位。在名为configure的文件中修改这一行:

    CFLAGS="-m32 -ansi -D_SVID_SOURCE -DOSS_AUDIO -D'ARCH=\"$host_cpu\"' $CFLAGS"
    

    删除-m32,给你:

    CFLAGS="-ansi -D_SVID_SOURCE -DOSS_AUDIO -D'ARCH=\"$host_cpu\"' $CFLAGS"
    

    运行./configure,然后运行make clean,然后运行make

    但是,我不建议这样做。库作者竭尽全力在 64 位系统上为 32 位构建此版本,如果您更改它可能无法正常工作。 (不过,它确实可以编译。)

【讨论】:

  • 改进 google-fu 的提示:找到解决方案最重要的部分是搜索错误消息的正确部分。如果你搜索“bits/libc-header-start.h: No such file or directory”,你会发现其他人也有同样的问题。
  • 听起来不太好争辩,但我已经尝试过确切的搜索字符串,并且从谷歌结果中获得这个特定的解决方案并不简单(没有事后诸葛亮的好处)
  • 哦,好的。这听起来很令人沮丧。嗯,谢谢你提前研究这个。我很感激。
【解决方案2】:

以下是调试和修复此问题的一种方法。由于大多数 linux 安装方式有所不同,因此 YMMV。

  1. 查找安装了哪个包libc-header-start.h
$ dpkg -S libc-header-start.h
libc6-dev:amd64: /usr/include/x86_64-linux-gnu/bits/libc-header-start.h

在工作系统上,/usr/include/bits 是指向/usr/include/x86_64-linux-gnu/bits 的符号链接。运行 dpkg search 给我们:

$ dpkg -S /usr/include/bits
libc6-dev-i386: /usr/include/bits

安装 libc6-dev-i386 会创建符号链接并解决错误。

但是,随后我遇到了链接器错误,链接器无法找到 libgcc (-lgcc)。显然 Linux 默认链接器在大多数情况下都需要 libgcc。进一步调试启用链接器详细程度的问题导致我缺少 lib32gcc-10-dev 包。

简而言之,除非需要非常可控的构建环境,否则在使用-m32 时安装gcc-multilib 包(gccclang 需要)。对于 C++,g++-multilib 也是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多