MacOS 13.1下安装Puma 5.6.4失败的技术求助
解决Puma 5.6.4在Rosetta环境下编译失败的问题
问题分析
从报错信息看,编译Puma 5.6.4时出现Undefined symbols for architecture x86_64: "_SSL_CTX_get0_param",说明编译链接阶段无法找到OpenSSL的SSL_CTX_get0_param函数。Puma 5.x版本的mini_ssl模块引入了该函数,你的环境虽指定了OpenSSL 1.1路径,但链接过程未正确关联对应库;而Puma 4.3.0能成功是因为其未使用这些较新的OpenSSL函数。
解决方案
步骤1:重新安装OpenSSL 1.1并配置环境变量
先卸载现有OpenSSL 1.1再重装,确保文件完整性:
brew uninstall --ignore-dependencies openssl@1.1 brew install openssl@1.1
设置环境变量,让编译工具优先找到正确的OpenSSL路径:
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH" export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include" export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
步骤2:手动安装Puma 5.6.4
通过pkg-config明确指定OpenSSL配置文件路径,确保编译时正确关联:
gem install puma -v '5.6.4' -- --with-pkg-config=/usr/local/opt/openssl@1.1/bin/pkg-config --with-cflags="-Wno-error=implicit-function-declaration"
步骤3:若仍失败,重新编译Ruby(关联正确OpenSSL)
如果你的Ruby版本是在未指定OpenSSL路径的情况下编译的,重新安装Ruby并关联OpenSSL 1.1:
rvm uninstall 2.7.5 rvm install 2.7.5 --with-openssl-dir=/usr/local/opt/openssl@1.1
完成后再执行bundle install。
步骤4:通过Bundler配置指定编译参数
若不想每次手动输入参数,可创建.bundle/config文件,让Bundler自动使用指定参数编译Puma:
BUNDLE_BUILD__PUMA: "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include --with-cflags=\"-Wno-error=implicit-function-declaration\" --with-pkg-config=/usr/local/opt/openssl@1.1/bin/pkgconfig"
保存后执行bundle install即可。
内容的提问来源于stack exchange,提问作者saoud
相关产品推荐
相关产品推荐

