CentOS7源码安装Ruby4.0.1
所有镜像站站点:Mirror Sites | Ruby,中国镜像站:pub/ruby/,我们通过中国镜像站进行源码下载。(不知道是我不稳定,还是它不稳定,反正不行就刷新)
(1).实验环境
4核8G CentOS7.9.2009
配置了阿里云yum源和阿里云epel,关闭防火墙,关闭SELinux。
(2).依赖环境
1、gcc/gcc-c++
Ruby 3.x及以上:通常需要 GCC 7.0+ 或更高版本。
Ruby 2.7 - 2.0:GCC 4.8+ 通常足够。但 GCC 4.8 是一个较老的基准线。
升级gcc具体参考:CentOS7升级gcc/gcc-c++。建议使用yum安装的gcc11,或源码安装的gcc稳定版本(11、12、13),可以直接使用"./configure --prefix=/usr/local/ruby-4.0.1 --disable-install-rdoc"进行配置,不需要指定gcc和g++的地址,也不会在make时遇到下面的错误。
2、OpenSSL
请查看当前版本的源码包中ext/openssl/History.md或README,我这里展示一下Ruby4.0.1的OpenSSL版本要求:

OpenSSL的升级请查看:CentOS7升级OpenSSL3.5.4
(2).编译安装
这里使用了OpenSSL3.5.4、gcc-14.3.0,安装Ruby4.0.1
1、安装依赖
[root@localhost ~]# yum install -y zlib-devel libyaml-devel openssl-devel libgdbm-devel libxml2-devel libxslt-devel libcurl-devel libicu-devel krb5-devel \ logrotate rsync python3-docutils pkgconfig libffi-devel
2、编译安装
[root@localhost ~]# tar zxvf ruby-4.0.1.tar.gz [root@localhost ~]# cd ruby-4.0.1 #--disable-install-rdoc在安装 Ruby 时不安装 RDoc 相关的文档文件 #RDoc是 Ruby 的文档生成工具,类似于 Java 中的 Javadoc。它可以从源代码中提取注释并生成格式化的文档。 [root@localhost ruby-4.0.1]# ./configure --prefix=/usr/local/ruby-4.0.1 --disable-install-rdoc [root@localhost ruby-4.0.1]# echo $? 0 [root@localhost ruby-4.0.1]# make -j$(nproc) [root@localhost ruby-4.0.1]# echo $? 0 [root@localhost ruby-4.0.1]# make install [root@localhost ruby-4.0.1]# echo $? 0
(3).使用源码编译的gcc-15.2.0时遇到的错误,记录一下
这里使用了OpenSSL3.5.4、gcc-15.2.0,安装Ruby4.0.1
#安装依赖 [root@localhost ~]# yum install -y zlib-devel libyaml-devel openssl-devel libgdbm-devel libxml2-devel libxslt-devel libcurl-devel libicu-devel krb5-devel \ logrotate rsync python3-docutils pkgconfig libffi-devel [root@localhost ~]# tar zxvf ruby-4.0.1.tar.gz [root@localhost ~]# cd ruby-4.0.1 #--disable-install-rdoc在安装 Ruby 时不安装 RDoc 相关的文档文件 #RDoc是 Ruby 的文档生成工具,类似于 Java 中的 Javadoc。它可以从源代码中提取注释并生成格式化的文档。 [root@localhost ruby-4.0.1]# CC=/usr/local/gcc-15.2.0/bin/gcc CXX=/usr/local/gcc-15.2.0/bin/g++ ./configure --prefix=/usr/local/ruby-4.0.1 --disable-install-rdoc [root@localhost ruby-4.0.1]# echo $? 0 [root@localhost ruby-4.0.1]# make -j$(nproc) vm.o: In function `vm_call_cfunc_with_frame_': vm.c:(.text+0x1aad6): undefined reference to `ruby_cmethod__entry_semaphore' vm.c:(.text+0x1abd2): undefined reference to `ruby_cmethod__return_semaphore' vm.o: In function `vm_trace_hook.isra.0': vm.c:(.text+0x1b62f): undefined reference to `ruby_method__entry_semaphore' vm.c:(.text+0x1b63f): undefined reference to `ruby_method__return_semaphore' vm.c:(.text+0x1b64a): undefined reference to `ruby_cmethod__entry_semaphore' vm.c:(.text+0x1b651): undefined reference to `ruby_cmethod__return_semaphore' vm.o: In function `rb_vm_pop_cfunc_frame': vm.c:(.text+0x1bc83): undefined reference to `ruby_cmethod__return_semaphore' vm.c:(.text+0x1bd35): undefined reference to `ruby_cmethod__return_semaphore' vm.o: In function `hook_before_rewind': vm.c:(.text+0x1c9b9): undefined reference to `ruby_method__return_semaphore' vm.o: In function `vm_exec_handle_exception': vm.c:(.text+0x1d25e): undefined reference to `ruby_cmethod__return_semaphore' vm.o: In function `vm_call0_body': vm.c:(.text+0x23d03): undefined reference to `ruby_cmethod__entry_semaphore' vm.c:(.text+0x23df9): undefined reference to `ruby_cmethod__return_semaphore' vm.o: In function `vm_opt_duparray_include_p.part.0': vm.c:(.text+0x27688): undefined reference to `ruby_array__create_semaphore' vm.o: In function `vm_exec_core': vm.c:(.text+0x2fcf5): undefined reference to `ruby_hash__create_semaphore' vm.c:(.text+0x30147): undefined reference to `ruby_hash__create_semaphore' vm.c:(.text+0x30a22): undefined reference to `ruby_array__create_semaphore' vm.c:(.text+0x317cd): undefined reference to `ruby_array__create_semaphore' vm.c:(.text+0x317fc): undefined reference to `ruby_hash__create_semaphore' vm.o:(.note.stapsdt+0x24): undefined reference to `ruby_cmethod__entry_semaphore' vm.o:(.note.stapsdt+0x94): undefined reference to `ruby_cmethod__return_semaphore' vm.o:(.note.stapsdt+0x104): undefined reference to `ruby_method__return_semaphore' vm.o:(.note.stapsdt+0x174): undefined reference to `ruby_method__entry_semaphore' vm.o:(.note.stapsdt+0x1e0): undefined reference to `ruby_cmethod__return_semaphore' vm.o:(.note.stapsdt+0x250): undefined reference to `ruby_method__return_semaphore' vm.o:(.note.stapsdt+0x2c0): undefined reference to `ruby_cmethod__return_semaphore' vm.o:(.note.stapsdt+0x330): undefined reference to `ruby_cmethod__return_semaphore' vm.o:(.note.stapsdt+0x3a0): undefined reference to `ruby_cmethod__entry_semaphore' vm.o:(.note.stapsdt+0x410): undefined reference to `ruby_array__create_semaphore' vm.o:(.note.stapsdt+0x46c): undefined reference to `ruby_hash__create_semaphore' vm.o:(.note.stapsdt+0x4c8): undefined reference to `ruby_hash__create_semaphore' vm.o:(.note.stapsdt+0x524): undefined reference to `ruby_array__create_semaphore' vm.o:(.note.stapsdt+0x580): undefined reference to `ruby_array__create_semaphore' vm.o:(.note.stapsdt+0x5dc): undefined reference to `ruby_hash__create_semaphore' collect2: error: ld returned 1 exit status make: *** [miniruby] Error 1
这个报错应该是GCC 编译器版本过新(15.2.0)与 Ruby 源码中的某些旧机制(如 SystemTap 探针)不兼容导致的。这些报错的符号是用于性能分析和调试(DTrace/SystemTap)的。如果你不是专门做 Ruby 核心性能分析的开发,完全可以禁用这些功能。在 ./configure 命令中添加 --disable-dtrace 参数,禁用 DTrace/SystemTap 支持。
[root@localhost ruby-4.0.1]# cd .. [root@localhost ~]# rm -rf ruby-4.0.1 [root@localhost ~]# tar xvf ruby-4.0.1.tar.xz [root@localhost ~]# cd ruby-4.0.1 [root@localhost ruby-4.0.1]# CC=/usr/local/gcc-15.2.0/bin/gcc CXX=/usr/local/gcc-15.2.0/bin/g++ ./configure --prefix=/usr/local/ruby-4.0.1 \ --disable-install-rdoc --disable-dtrace [root@localhost ruby-4.0.1]# echo $? 0 [root@localhost ruby-4.0.1]# make -j$(nproc) [root@localhost ruby-4.0.1]# echo $? 0 [root@localhost ruby-4.0.1]# make install [root@localhost ruby-4.0.1]# echo $? 0

浙公网安备 33010602011771号