编译HTK时出现“严重错误:bits / libc-header-start.h:无此类文件或目录”

时间:2019-01-07 21:58:06

标签: c makefile htk

尝试在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位库来解决此问题。

2 个答案:

答案 0 :(得分:4)

-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位版本,如果您更改此版本,它可能无法正常工作。 (不过确实可以编译。)

答案 1 :(得分:0)

这是调试和解决此问题的一种方法。由于所有 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 包,无论是使用 gcc 还是使用 clang。对于 C++,还需要 g++-multilib