无法在 OS X Yosemite 上构建 puma gem

Posted

技术标签:

【中文标题】无法在 OS X Yosemite 上构建 puma gem【英文标题】:Cannot build puma gem on OS X Yosemite 【发布时间】:2015-02-12 10:58:02 【问题描述】:

(修改后的)问题:

在我的 OS X Yosemite (10.10.1) 系统上安装 puma gem 需要什么?我已经用尽了很多方法(我有 XCode 工具,我有 OpenSSL),但在尝试构建本机扩展时仍然失败。

问题

在我的 OS X 系统上,当我这样做时:

$ gem install puma

我明白了:

Building native extensions.  This could take a while...
ERROR:  Error installing puma:
        ERROR: Failed to build gem native extension.

    /Users/home/sandbox/usr/bin/ruby extconf.rb
checking for SSL_CTX_new() in -lssl... no
checking for SSL_CTX_new() in -lssleay32... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --with-opt-include
        --without-opt-include=$opt-dir/include
        --with-opt-lib
        --without-opt-lib=$opt-dir/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/Users/home/sandbox/usr/bin/ruby
        --with-puma_http11-dir
        --without-puma_http11-dir
        --with-puma_http11-include
        --without-puma_http11-include=$puma_http11-dir/include
        --with-puma_http11-lib
        --without-puma_http11-lib=$puma_http11-dir/lib
        --with-ssllib
        --without-ssllib
        --with-ssleay32lib
        --without-ssleay32lib

extconf failed, exit code 1

Gem files will remain installed in /Users/home/sandbox/usr/lib/ruby/gems/2.1.0/gems/puma-2.10.2 for inspection.
Results logged to /Users/home/sandbox/usr/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-14/2.1.0/puma-2.10.2/gem_make.out

环境

我怀疑gem install 无法找到 SSL 标头和/或库。这是我系统上的内容(请注意,~/sandbox/usr 是我的“沙盒”目录,包含我的 Ruby on Rails 开发的所有可执行文件、库、头文件等)。请注意,“ssl.h”确实定义了 SSL_CTX_new():

$ which openssl
~/sandbox/usr/bin/openssl
$ openssl version
OpenSSL 1.0.1j 15 Oct 2014
$ openssl version -d
OPENSSLDIR: "/Users/home/sandbox/usr/ssl"
$ find ~/sandbox/usr -name "*libssl*" -print
~/sandbox/usr/lib/libssl.a
$ find ~/sandbox/usr -name "*.h" -exec grep SSL_CTX_new  /dev/null \;
~/sandbox/usr/include/openssl/ssl.h:SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);

此外,这是 ruby​​ 的编译方式。 $INSTALL_DIR 是 ~/home/sandbox:

./configure --prefix=$(INSTALL_DIR) --enable-shared --disable-install-doc --with-opt-dir=$(INSTALL_DIR) --with-openssl-dir=$(INSTALL_DIR)/bin; where INSTALL_DIR is ~/sandbox/usr. 

问题

我只是缺少构建过程的一些配置标志吗?我或多或少地随机尝试了一堆标志:

$ gem install puma -- --with-openssl-dir=/Users/home/sandbox/usr/ssl
$ gem install puma -- --with-ssllib=/Users/home/sandbox/usr/lib/libssl.a 
$ gem install puma -- --with-ssl=/Users/home/sandbox/usr/bin/openssl
$ gem install puma -- --with-ssl=/Users/home/sandbox/usr/bin
$ gem install puma -- --with-opt-dir=/Users/home/sandbox/usr

但在每种情况下都会出现相同的错误。有人能告诉我我错过了什么吗?

更多信息...

包含错误的 mkmf.log 文件如下所示(为便于阅读添加了换行符):

"clang -o conftest 
-I/Users/home/sandbox/usr/include/ruby-2.1.0/x86_64-darwin14.0 
-I/Users/home/sandbox/usr/include/ruby-2.1.0/ruby/backward 
-I/Users/home/sandbox/usr/include/ruby-2.1.0 
-I.  
-I/Users/home/sandbox/usr/include 
-D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT    
-O3 -fno-fast-math -ggdb3 -Wall -Wextra 
-Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers 
-Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement 
-Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wextra-tokens  
-fno-common -pipe conftest.c  
-L. 
-L/Users/home/sandbox/usr/lib 
-L/Users/home/sandbox/usr/lib 
-L. -fstack-protector 
-L/Users/home/sandbox/usr/lib      
-lruby.2.1.0 -lssl  -lpthread -ldl -lobjc "

conftest.c:13:57: error: use of undeclared identifier 'SSL_CTX_new'

int t(void)  void ((*volatile p)()); p = (void ((*)()))SSL_CTX_new; return 0; 

当我浏览我的沙盒目录树时,唯一定义 SSL_CTX_new 的头文件是 ~/sandbox/include/openssl/ssl.h。似乎没有包含该文件,我目前不知道为什么。

【问题讨论】:

也许我愚蠢地浪费了赏金:我可以让 puma v2.9.1 安装得很好,但 v2.9.2 及更高版本显示了上述问题。我已经在 puma 存储库上提交了一个问题。我很乐意将赏金积分提供给任何可以告诉 puma 开发人员需要修复什么的人。 我查看了您在 gh 上提交的问题...很高兴您找到了解决方案...我对我的团队在我们所有的应用程序上运行 puma 并且对 puma 没有任何问题感兴趣由于 OSX 升级......唯一的区别是我们使用 rvm 和 rbenv 管理我们的 ruby​​ 安装。 【参考方案1】:

对于遇到 puma 和 openssl 问题的人,尤其是使用 Mac OS 10.11 (El Capitan) 的人,添加一些标志将为您节省数小时的心痛:

gem install puma -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib

https://gist.github.com/edvinasbartkus/0e99ea8305a20737f562

【讨论】:

太棒了!你刚刚救了我一个通宵达旦 你先生...拯救了我的一天:D @Dennis Best 谢谢好心的先生,为我节省了数小时的研究时间。你绝对应该把它变成其他人的社区维基。 Public Wiki with reference 如果有人对 heroku 有问题,并且遇到 'bundle install' 错误 gem puma 安装不正确,只需使用此脚本并添加 '-v 2.9.1' @Dennis,为我工作,在此之前我几乎尝试了所有方法【参考方案2】:

原来这是 puma 2.9.2+ 版本中的一个错误,并已在 2.11.0 版本中修复。详情请见https://github.com/puma/puma/issues/627和https://github.com/puma/puma/pull/628。

(unix 用户注意:如果您仍然遇到问题,请确保您已经安装了 libssl-dev。)

【讨论】:

【参考方案3】:

我在 OSx El Capitan 上遇到了类似的问题。以下是对我有帮助的:

brew install openssl
brew link --force openssl

【讨论】:

【参考方案4】:

您的 Ruby 安装是否确实配置了 --with-openssl-dir? (通常是这个过程中不有趣的部分。)你可以require 'openssl'?

我可以在没有任何标志的情况下安装具有类似配置的 puma。 (而且我认为在你的主目录下安装 OpenSSL 是一个明智的决定。)

【讨论】:

(糟糕——愚蠢的 5 分钟编辑限制!)是的:ruby 是用 ./configure --prefix=$(INSTALL_DIR) --enable-shared --disable-install-doc --with-opt-dir=$(INSTALL_DIR) --with-openssl-dir=$(INSTALL_DIR)/bin; 编译的,其中 INSTALL_DIR 是 ~/sandbox/usr。并且 rails runner "puts require 'openssl'" => "true",所以看来 openssl 是存在的。 我也打算发布我的,其中还包括--with-gcc=clang(但我不确定这是否与此处相关)。 当我更多地盯着 mkmf.log 时,我发现问题是它找不到定义 SSL_CTX_new() 的头文件——它与加载程序或 lib 文件无关.我看到的是相关的头文件(~/sandbox/usr/include/openssl/ssl.h)是如何被包含进来的。 您是否已经查看了 Puma 的问题列表? (例如:github.com/puma/puma/issues/599) 我已经用--with-openssl-dir=/Users/u/opt/openssl(在bin上方)配置了Ruby。

以上是关于无法在 OS X Yosemite 上构建 puma gem的主要内容,如果未能解决你的问题,请参考以下文章

如何在Mac OS X Yosemite上安装 jdk 1.6 开发环境

sh 在OS X Yosemite上安装OpenCV

XAMPP MySQL 数据库无法在 Mac OS X Yosemite Beta 2 中启动

安装 Mac OS X Yosemite (Mac OS 10.10) 后 Eclipse 无法启动

转在VMware中安装OS X Yosemite

在 Mac OS X Yosemite 上安装 Python3