“致命错误:bits/libc-header-start,h:编译HTK时没有这样的文件或目录

66bbxpm5  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(369)

我在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

等等
此外,编译和运行一个sanity-check C文件也可以很好地工作(只需在其main方法中执行printf("hello!");)。
如果这是一个众所周知的错误,我道歉-我对C库的经验仅限于使用make编译和安装它们。

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

后来我得到了一个类似原因的错误:我通过执行sudo apt-get install libx11-dev:i386 libx11-dev来检索丢失的32位库来解决这个问题。

tzcvj98z

tzcvj98z1#

-m32告诉gcc编译32位平台。在64位平台上,gcc通常只附带64位库。你有两个选择:
1.安装32位头文件和库。这是你如何在Ubuntu上做到这一点。
运行以下命令:

sudo apt-get install gcc-multilib

1.编译为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位的版本,我不能保证如果你这样做,它会正常工作。(但它确实编译了。)

qeeaahzv

qeeaahzv2#

下面是调试和修复此问题的一种方法。由于大多数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也是必需的。

相关问题