RHEL8.5 64位系统gcc -m32编译32位C程序报stubs-32.h缺失
32位编译开关正确性说明
你使用的-m32是GCC指定生成32位目标程序的标准正确编译参数,本身不存在用法错误,触发的报错和编译开关无关,是系统缺少32位编译依赖导致的。
报错根因
gnu/stubs-32.h是32位版本glibc的核心头文件,RHEL 8.5默认仅安装64位版本的glibc开发组件,不会默认预装32位程序编译需要的头文件、链接库,因此编译时会出现头文件找不到的致命错误。
解决步骤
- 先确认当前系统已配置可用的RHEL 8.5对应BaseOS、AppStream软件源,32位兼容包均由这两个仓库提供。
如果你的RHEL 8.5没有注册红帽官方订阅,必须先配置对应版本的本地/第三方dnf源,否则后续安装命令会提示找不到
glibc-devel.i686包。
- 执行命令安装32位glibc开发包:
dnf install glibc-devel.i686
- 如果后续编译进入链接阶段后,出现找不到32位系统库(如
libc.so、libm.so)的报错,补充安装基础32位运行、开发依赖:
dnf install libgcc.i686 libstdc++-devel.i686
- 依赖安装完成后可以先验证头文件是否就位,执行
ls /usr/include/gnu/stubs-32.h,如果命令正常返回文件路径,重新执行原gcc -m32 ksi_rpt.c命令即可正常编译。
迁移注意事项
Solaris和Linux的系统调用逻辑、系统接口的结构体定义、部分数据类型的边界实现存在差异,就算编译依赖全部安装完成,后续如果遇到编译报错或者运行异常,要针对这些平台差异做适配,不要默认Solaris上的32位C代码可以直接无修改在Linux上编译运行。
内容的提问来源于stack exchange,提问作者BDeGan
相关产品推荐
相关产品推荐

