【问题标题】:`gem install therubyracer` fails on Mac OS X Lion`gem install therubyracer` 在 Mac OS X Lion 上失败
【发布时间】:2012-06-09 23:21:30
【问题描述】:

如果能帮助我让gem install therubyracer 工作,我将不胜感激。这是错误:

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

        /Users/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
checking for main() in -lobjc... yes
*** 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/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby
    --with-objclib
    --without-objclib
extconf.rb:15:in `<main>': undefined method `include_path' for Libv8:Module (NoMethodError)

以下是我在出现错误之前运行的一些值得注意的步骤。他们工作得很好:

$ gem install libv8
$ brew install v8

我的环境是:

  • Mac OS X Lion 10.7.4
  • ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-darwin11.4.0](通过 rvm)
  • V8 版本 3.9.24(通过自制软件)

【问题讨论】:

标签: ruby rubygems v8


【解决方案1】:

这对我有用:

$ gem uninstall libv8
$ gem install therubyracer

(非常感谢http://www.ruby-forum.com/topic/4306127)

【讨论】:

  • 我在 ruby​​ 1.9.3p194 上,但这不起作用。 "make: g++-4.2: 没有这样的文件或目录"
  • 我尝试安装所有 gems 组合,但没有任何效果。我最终只是将 gemdir 从 ruby​​1.9.2p125 目录复制到新的 p194 目录。
  • @jspooner 对于很多人来说,这是一个相对棘手的安装过程。如果您觉得可以,请像我一样发布一个问题,详细说明您的配置设置、您尝试了什么等等。
  • :( 对我不起作用,这是我得到的:错误:安装 therubyracer 时出错:错误:无法构建 gem 原生扩展。/Users/lionel_lei/.rvm/rubies/ruby- 1.9.3-p194/bin/ruby extconf.rb 检查 -lobjc 中的 main()... 是创建 Makefile make 编译 rr.cpp make: clang++: No such file or directory make: *** [rr.o]错误 1
  • @lionel 您能否发布您所尝试的内容的要点?您是否尝试过从头开始设置新的rbenv 或rvm 安装并写下步骤(在要点中)以隔离问题?你先brew install v8了吗?
【解决方案2】:

最后我使用了 therubyracer 0.11.0beta5 作为解决方案。

使用 therubyracer (0.11.0beta5)

在 Gemfile 上添加以下内容

gem 'therubyracer', '~> 0.11.0beta5'
group :libv8 do
  gem 'libv8', "~> 3.11.8"
end

然后bundle install

Mac OSX 10.8 山狮

【讨论】:

  • 我试过这个,但是:Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension。 /Users/lionel_lei/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb 检查 -lpthread 中的 main() ... 是 检查 -lobjc 中的 main() ... 是 创建 Makefile make compile accessor.cc make: clang++: No such file or directory make: *** [accessor.o] Error 1 i am on Rails 3.2.6, ruby​​ 1.9.3p194 (2012-04-20 revision 35410) [x86_64- darwin11.4.1],osx 10.7.4
【解决方案3】:

对于在 Mac OSX 10.8 Mountain Lion 上尝试使用 gem 'therubyracer', '0.11.0' 升级其 Gemfile 时遇到此问题的任何人,只需升级系统 libv8 gem 对我有用(无需卸载任何其他 gem必要):

$ gem update libv8
$ bundle install

编辑

如果您使用Travis-CI(或我假设位于其他服务器上的其他 CI 工具),您还需要将 libv8 gem 显式添加到您的 Gemfile 中:

宝石文件

gem 'libv8', '3.11.8.3'

然后像往常一样bundle install。请注意,libv8 可能需要大量时间来安装,我注意到它最终可能会导致超过Travis CI's timeout limits,从而导致您的构建失败。您可以稍微缓解这种情况,在您的构建中不包括开发环境 gem:

.travis.yml

# ...
bundler_args: --binstubs=./bundler_stubs --without development

更新

是的,几乎我所有的 Travis 构建都会超时并因此而失败。如果有人知道解决此问题的方法(我希望“降级therubyracer”是最后的手段),请发表评论!

更新 2

这可能不适用于所有应用程序,但似乎我的 Rails 3.2.9 应用程序实际上并不需要 therubyracer 或 libv8。从我的 Gemfile 中删除这些 gem 后,我确认我的规范通过了,再次推送给 Travis 并成功构建。所以,我想摆脱那些宝石(如果你不确定你是否真的需要它们)至少值得一试。

更新 3

感谢 Paul Annesley 确认如果您使用的是 Mac OS X 10.8 Mountain Lion,则根本不需要 therubyracer gem,因为该操作系统已经与 Apple JavaScriptCore(其自己的 Javascript 运行程序)捆绑在一起。在最初回答时,我在 Snow Leopard 上,因此需要它。

【讨论】:

  • 关于“Update 2”并且不需要therubyracer或libv8,大概这意味着你要么没有使用CoffeeScript,要么使用了替代的JS runner。
  • 我确实使用过 Coffeescript,当然。回想起来,我相信我在将 OS X 从 Snow Leopard 升级到 Mountain Lion 后不久就进行了该编辑,所以也许 Mountain Lion 有自己的 JS 运行器,这使得 therubyracer 不必要...?
  • 啊,是的; “Apple JavaScriptCore - 包含在 Mac OS X 中”被列为 github.com/sstephenson/execjs/blob/master/README.md 上的运行时之一
  • 非常感谢您的确认。我已将其添加到答案中。
  • 出于某种原因,我每次开始在本地运行一个应用程序时都必须运行此命令。有人可以解释一下,为什么我必须每次都运行它而不是一次。
【解决方案4】:

有同样的错误,这对我有用:

  1. 来自控制台:gem uninstall libv8

  2. 在您的 Gemfile 中,添加以下内容:

    gem 'therubyracer', :platforms => :ruby, :require => 'v8'
    gem 'libv8', '~> 3.11.8'  # Update version number as needed
    
  3. 来自控制台:bundle install

如果您正在升级rubyracer gem,您可能还想在此之后运行bundle update therubyracer。 (考虑指定版本号)

这是在 Mac 10.6 (Snow Leopard) 上。

【讨论】:

    【解决方案5】:

    OSX 10.8.2,红宝石 1.9.3p125

    以上方法都不适合我...我厌倦了为我的环境寻找合适的 gem,所以我只是软链接到 g++ 目标,这是缺少的东西:

    sudo ln -s `which g++` /usr/bin/g++-4.2
    

    对于远程部署没有多大帮助,但可以在我的工作站上完成工作。

    【讨论】:

      【解决方案6】:
      gem uninstall libv8
      brew install v8
      gem install therubyracer
      

      【讨论】:

      • 谢谢肯。安装大约需要 3-5 分钟。一切与自动安装 libv8-3.11.8.13 的 ruby​​racer-0.11.2 一起工作。
      • 谢谢!对我来说就像一个魅力。
      【解决方案7】:

      但是,为什么会发生这种情况,你问?为什么卸载libv8 并重新安装therubyracer 可以解决问题?

      答案在错误消息的底部(来自原始帖子)。忽略有关的东西

      probably lack of necessary libraries and/or headers
      

      这是编写该错误消息的人的错误假设。在底部,您会看到 Ruby 对此有何评论:

      undefined method `include_path' for Libv8:Module
      

      在我的例子中,我试图用bundle install 安装therubyracer-0.9.8,出于某种原因,它试图使用我在某个时候安装的libv8-3.11.8.13 副本,可能作为其他一些宝石。

      我不知道它为什么要尝试使用较新的版本,因为therubyracer.gemspec 包含s.add_dependency "libv8", "~&gt; 3.3.10"。我的Gemfile.lock 说要使用libv8 (3.3.10.2)。但很可惜,这确实是正在发生的事情。

      确实,Libv8:Module 确实没有在libv8-3.11.8.13 中有方法include_path,但它有在libv8-3.3.10.2

      这就是为什么卸载所有您的libv8 版本,然后重新安装therubyracer 工作。因为所有没有方法include_path的libv8版本都被完全删除了,有方法include路径的libv8是重新安装therubyracer时重新安装。

      【讨论】:

      • 感谢您抽出宝贵时间来解释为什么会这样
      • 如果我不想删除较新版本的libv8,以防其他项目依赖它怎么办?那我该怎么办?
      • 找到了!检查我的Gemfile 不需要特定的 therubyracer 版本。然后我删除了旧的Gemfile.lock,它指定了旧的therubyracer 版本,而这又需要旧的libv8 版本。 (之前肯定有人把它提交到项目中,然后bundle install在安装的时候尝试使用它。)当我再次运行bundle install时,它用新的连接创建了一个新的Gemfile.lock,并hook了最新的therubyracer版本到最新的libv8版本,没问题。
      【解决方案8】:

      考虑到如果上述方法 100% 对我有用,我想我会发布所做的(作为 Rails 项目的一部分):

      gem uninstall libv8
      bundle update therubyracer
      

      这确保我获得了最新的 therubyracer,以及更新版本的 libV8,并且似乎解决了我遇到的多个问题,从缺少 libv8.a 文件到未定义的方法。

      【讨论】:

      • 它是唯一在 osx 10.9.1 (Maverick) 上帮助我的人
      • 您能否解释一下为什么每次我需要部署一个特定的应用程序时都必须运行此命令。我使用的是 Mac。
      • 不需要多次运行它吗?除非您有多个版本的任一 gem,并且您正在使用 Gemfile.lock 做一些奇怪的事情?
      • 这是为我做的,Rails 4,Mac OS 10.9.4。感谢大家的帮助。
      【解决方案9】:

      我遇到了类似的问题,但它也抱怨找不到 g++-4.2。我确实安装了 XCode 命令行工具,但它正在寻找 /usr/bin/g++-4.2,我有 g++(这是一个指向 llvm-g++-4.2 的符号链接)。无论如何,我刚刚创建了一个指向 g++ 的符号链接并再次尝试了 bundle install ......它成功了!

      $ cd /usr/bin

      $ sudo ln -s g++ g++-4.2

      【讨论】:

        【解决方案10】:

        对我来说,删除 Gemfile.lock 文件并运行 bundle install 很神奇。

        【讨论】:

        • 请注意,运行 bundle update 实际上与删除 Gemfile.lock 然后运行 ​​bundle install 相同。
        【解决方案11】:

        如果您需要 0.11.3 并且它失败了,请尝试使用 Mac OS X 10.9...

        gem uninstall libv8
        brew install v8
        gem install libv8 -- --with-system-v8
        gem install therubyracer -v '0.11.3' -- --with-system-v8
        

        更多详情请见this issue。

        您可能不需要最后一行的-- --with-system-v8,但我这样做只是为了安全,因为我在运行命令时看到它开始执行Fetching: libv8-3.11.8.17-x86_64-darwin-13.gem (1%)...

        无论如何,它对我有用,而其他所有东西都没有。

        【讨论】:

        • 这对我也有用,--with-system-v8 在最后一行是强制性的
        猜你喜欢
        • 2012-04-02
        • 2015-03-01
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 2016-01-17
        • 2011-11-16
        相关资源
        最近更新 更多