CentOS7源码安装Ruby4.0.1

  官网:Ruby 程序设计语言官方网站

  所有镜像站站点: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.0GCC 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版本要求:

image

   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

  

posted @ 2026-01-23 12:51  苦逼运维  阅读(4)  评论(0)    收藏  举报