Mac环境下安装Ruby 3.1.3时OpenSSL错误的解决方法
问题
执行ruby-install ruby 3.1.3安装Ruby时编译失败,错误提示与OpenSSL版本冲突有关。已知Ruby 3.1及以上版本需要OpenSSL 3,但安装过程中实际调用了OpenSSL 1.1,且已按GitHub说明配置RUBY_CONFIGURE_OPTS,仍无法解决。
错误信息:
ossl_ts.c:829:5: error: incomplete definition of type 'struct TS_verify_ctx' TS_VERIFY_CTX_set_certs(ctx, x509inter); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./openssl_missing.h:215:46: note: expanded from macro 'TS_VERIFY_CTX_set_certs' # define TS_VERIFY_CTX_set_certs(ctx, crts) TS_VERIFY_CTS_set_certs(ctx, crts) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./openssl_missing.h:195:52: note: expanded from macro 'TS_VERIFY_CTS_set_certs' # define TS_VERIFY_CTS_set_certs(ctx, crts) ((ctx)->certs=(crts)) ~~~~~^ /opt/homebrew/Cellar/openssl@3/3.1.3/include/openssl/ts.h:407:16: note: forward declaration of 'struct TS_verify_ctx' typedef struct TS_verify_ctx TS_VERIFY_CTX; ^ 1 warning and 1 error generated. make[2]: *** [ossl_ts.o] Error 1 make[1]: *** [ext/openssl/all] Error 2 make: *** [build-ext] Error 2 !!! Compiling ruby 3.1.3 failed!
已尝试多个相关方案但未解决。
解决方案
强制指定OpenSSL 3路径执行安装
先确认OpenSSL 3的安装路径(Homebrew安装的默认路径为/opt/homebrew/opt/openssl@3),执行以下命令安装:RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/homebrew/opt/openssl@3" ruby-install ruby 3.1.3Linux系统下路径可能为
/usr/local/opt/openssl@3或/usr/lib/openssl-3,根据实际情况调整。清理环境变量中的旧OpenSSL引用
检查当前环境是否有指向OpenSSL 1.1的变量:echo $PATH echo $LDFLAGS echo $CPPFLAGS如果输出包含OpenSSL 1.1的路径,临时移除后再执行安装:
export PATH=$(echo $PATH | sed 's/\/opt\/homebrew\/opt\/openssl@1.1\/bin://g') export LDFLAGS=$(echo $LDFLAGS | sed 's/\-L\/opt\/homebrew\/opt\/openssl@1.1\/lib://g') export CPPFLAGS=$(echo $CPPFLAGS | sed 's/\-I\/opt\/homebrew\/opt\/openssl@1.1\/include://g')之后重新运行ruby-install命令。
改用ruby-build工具安装
如果ruby-install问题无法解决,尝试用ruby-build:brew install ruby-build export RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/homebrew/opt/openssl@3" ruby-build 3.1.3 ~/.rbenv/versions/3.1.3手动打OpenSSL兼容补丁
该错误源于Ruby 3.1.3的openssl扩展与OpenSSL 3 API不兼容,手动应用补丁:- 下载Ruby 3.1.3源码但不安装:
ruby-install --src-dir=/tmp/ruby-src ruby 3.1.3 --no-install - 进入openssl扩展目录:
cd /tmp/ruby-src/ruby-3.1.3/ext/openssl - 从ruby/openssl仓库的PR#639获取对应兼容补丁,保存到本地后应用:
patch -p1 < path/to/639.patch - 手动编译安装:
cd ../.. ./configure --with-openssl-dir=/opt/homebrew/opt/openssl@3 make sudo make install
- 下载Ruby 3.1.3源码但不安装:
内容的提问来源于stack exchange,提问作者olivarb
相关产品推荐
相关产品推荐

