在64位Linux操作系统上编译32位程序导致致命错误

41

使用

gcc -m32 myprog.c

需要在32位版本中编译myprog.c文件。

不幸的是,我收到了以下错误信息:

In file included from /usr/include/stdio.h:27:0,
                 from myprog.c:1:
/usr/include/features.h:374:25: fatal error: sys/cdefs.h: No such file or directory
#include <sys/cdefs.h>

我该如何修复这个问题?

如果我不使用-m32,它可以正常工作,但是会使用64位指令。


1
如果你移除 -m32 标志,程序能够正常编译吗? - Some programmer dude
希望http://forums.xilinx.com/t5/High-Level-Synthesis-HLS/Vivado-HLS-cdefs-h-No-such-file-or-directory/td-p/324969能够帮助。 - coder hacker
@JoachimPileborg 是的,如果我去掉-m32选项就可以编译,但是使用64位指令进行编译。 - AndreaF
7
您需要安装32位开发库和头文件(该软件包通常命名为ia32-libs-dev或类似名称)。 - Some programmer dude
1
你需要安装一些包含正确头文件的32位编译器包吗?编辑:@JoachimPileborg比我更快! - rjp
我最初想到的是,我需要安装什么?(我只需要使用32位指令编译简单的C方法) - AndreaF
4个回答

81

要在64位的Linux版本上编译32位二进制文件,你需要安装libx32gcc开发包和32位GNU C Library

试试这个

sudo apt-get install libx32gcc-4.8-dev

sudo apt-get install libc6-dev-i386

8
谢谢。顺便说一下,安装 libc6-dev-i386 会自动安装 libx32gcc,因此无需手动安装它:D - Fady Mohamed Othman
libx32gcc与lib32gcc不同。libx32gcc依赖于在以32位模式运行的x86_64 CPU上找到的扩展。如果您的目标是真正的32位英特尔CPU,它将失败。 - Wyatt Ward
亲爱的,我尝试编译wine32时遇到了同样的问题。这里的提示 [CODE]"./configure --libdir=/usr/local/lib32"[/CODE] 对我非常有帮助,它来自于这个网址 https://github.com/skycocker/chromebrew/issues/142 - Estatistics

13

您需要gcc的多架构支持。安装包gcc-multilib。例如:

sudo apt-get install gcc-multilib

1
为解决问题,我们首先需要知道哪个软件包提供了文件sys/cdefs.h
在基于CentOs/RHEL的系统中,可以通过运行以下命令找到它。
yum provides '*sys/cdefs.h'

同样,在Debian/Ubuntu系统中,您可以通过运行以下命令找到它:

apt-file search 'sys/cdefs.h'

注意:如果系统上没有安装apt-file软件包,请使用以下命令进行安装。
apt-get install apt-file

以上两个命令将扫描相应的软件包管理系统数据库,即RPM/Apt,并告知提供以"sys/cdefs.h"结尾的文件的软件包名称。

从命令列出的软件包中安装适当的软件包。
例如:

在CentOs/RHEL上

yum install glibc-headers 

在Debian/Ubuntu上
apt-get install libc6-dev

这种方法不仅对于此特定问题有用,而且对于任何报告某个包未提供所需文件的类似问题都很有用。

1
我遇到了同样的问题。当我尝试在64位Ubuntu版本中构建32位so文件时。
你可以通过将lib版本切换为64位来构建。 在netbeans中 (->项目属性->C编译器->附加选项)设置为
-shared -m64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接