在Arch Linux/Manjaro上用ruby-build安装Ruby 3.1.0失败求助
安装Ruby 3.1.0失败,3.2.0+版本可正常安装
问题详情
在ManjaroLinux 25.0.2 x86_64系统中,使用ruby-build 20250529.1安装Ruby 3.1.0时触发构建失败,报错:
BUILD FAILED (ManjaroLinux 25.0.2 on x86_64 using ruby-build 20250529.1)
Ruby 3.2.0及更高版本可正常安装。错误日志核心内容如下:
./include/ruby/internal/stdbool.h:43:23: error: ‘_Bool’ cannot be defined via ‘typedef’ 43 | typedef unsigned char _Bool; | ^~~~~ ./include/ruby/internal/stdbool.h:43:23: note: ‘_Bool’ is a keyword with ‘-std=c99’ onwards ./include/ruby/internal/stdbool.h:43:1: warning: useless type name in empty declaration 43 | typedef unsigned char _Bool; | ^~~~~~~ In file included from ./include/ruby/backward/2/bool.h:22, from ./include/ruby/defines.h:74, from ./include/ruby/ruby.h:25, from internal.h:28, from compar.c:13:
日志最终提示:
external command failed with status 2
已尝试以下操作但未解决问题:
- 通过指定OpenSSL 1.1路径安装:
RUBY_CONFIGURE_OPTS=--with-openssl-dir=/usr/lib/openssl-1.1 asdf install ruby 3.1.0 - 安装
ruby-erb包
解决方案
1. 强制使用兼容的C标准编译
错误根源是Ruby 3.1.0的头文件试图定义_Bool类型,但新版本GCC默认启用C99及以上标准,_Bool已成为关键字,无法通过typedef重新定义。可以通过编译参数规避:
方式A:指定C90标准编译
CFLAGS="-std=c90" asdf install ruby 3.1.0
方式B:禁用Ruby的自定义_Bool定义
添加宏定义让Ruby跳过自身的_Bool定义,直接使用系统标准:
CFLAGS="-DRUBY_NO_STD_BOOL" asdf install ruby 3.1.0
2. 使用补丁修复代码冲突
Ruby 3.1.0在新系统环境下的代码冲突可以通过社区补丁解决,你可以查找ruby-build官方仓库中针对Ruby 3.1.0的兼容补丁,通过以下方式指定补丁安装:
RUBY_BUILD_PATCH_URL="/本地补丁路径或可靠补丁地址" asdf install ruby 3.1.0
3. 临时使用旧版GCC编译
如果上述方法无效,可以临时安装旧版GCC(如GCC 11),指定其作为编译工具:
# 先安装GCC 11(以Manjaro为例) sudo pacman -S gcc11 # 指定GCC 11编译Ruby CC=gcc-11 asdf install ruby 3.1.0
内容的提问来源于stack exchange,提问作者paulodiovani
相关产品推荐
相关产品推荐

