"fatal error: bits/libc-header-start.h: No such file or directory" while compiling HTK
"fatal error: bits/libc-header-start.h: No such file or directory" while compiling 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
适当returns
. /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 文件工作正常(只需在其主要方法中执行 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 位库来解决这个问题。
-m32
告诉 gcc 为 32 位平台编译。在 64 位机器上,gcc 通常只带有 64 位库。您有两个选择:
安装 32 位头文件和库。以下是您在 Ubuntu.
上的操作方式
运行 这个命令:
sudo apt-get install gcc-multilib
改为编译 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 位版本,如果您更改它,它可能无法正常工作。 (不过它确实可以编译。)
下面是调试和修复此问题的一种方法。由于大多数 linux 安装在某种程度上有所不同,YMMV。
- 查找安装了哪个包
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 搜索给我们:
$ 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
或 [=21= 需要]).对于 C++,还需要 g++-multilib
。
我在 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
适当returns
. /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 文件工作正常(只需在其主要方法中执行 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 位库来解决这个问题。
-m32
告诉 gcc 为 32 位平台编译。在 64 位机器上,gcc 通常只带有 64 位库。您有两个选择:
安装 32 位头文件和库。以下是您在 Ubuntu.
上的操作方式运行 这个命令:
sudo apt-get install gcc-multilib
改为编译 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 位版本,如果您更改它,它可能无法正常工作。 (不过它确实可以编译。)
下面是调试和修复此问题的一种方法。由于大多数 linux 安装在某种程度上有所不同,YMMV。
- 查找安装了哪个包
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 搜索给我们:
$ 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
或 [=21= 需要]).对于 C++,还需要 g++-multilib
。