70

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 狮子 10.7.4
  • ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-darwin11.4.0](通过 rvm)
  • V8 版本 3.9.24(通过自制软件)
4

11 回答 11

106

这对我有用:

$ gem uninstall libv8
$ gem install therubyracer

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

于 2012-06-05T22:28:52.547 回答
43
gem uninstall libv8
brew install v8
gem install therubyracer
于 2012-12-17T23:31:34.690 回答
40

但是,你问为什么会这样?为什么卸载libv8和重新安装可以therubyracer解决问题?

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

probably lack of necessary libraries and/or headers

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

undefined method `include_path' for Libv8:Module

就我而言,我试图使用 进行安装therubyracer-0.9.8bundle install并且由于某种原因,它试图使用我的副本libv8-3.11.8.13,该副本已在某个时候安装,可能作为其他一些 gem 的依赖项。

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

确实Libv8:Module没有in 中的方法,但确实ininclude_pathlibv8-3.11.8.13libv8-3.3.10.2

这就是为什么卸载所有版本libv8然后重新安装的原因therubyracer。因为所有没有方法的版本libv8都被彻底删除,而有方法路径的版本在重装的时候会重新安装。include_pathlibv8includetherubyracer

于 2013-05-24T16:09:31.863 回答
15

如果以上内容对我 100% 有效,则不考虑,我想我会发布所做的事情(作为 rails 项目的一部分):

gem uninstall libv8
bundle update therubyracer

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

于 2013-12-03T14:53:11.313 回答
12

最后我使用了 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 山狮

于 2012-07-29T07:45:02.497 回答
10

如果您需要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

有关详细信息,请参阅此问题。

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

无论如何,当所有其他事情都没有时,它对我有用。

于 2014-07-28T07:33:42.857 回答
7

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

$ gem update libv8
$ bundle install

编辑

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

宝石文件

gem 'libv8', '3.11.8.3'

然后bundle install像往常一样。请注意,libv8安装可能需要大量时间,而且我注意到它可能最终导致超过Travis CI 的超时限制,从而导致构建失败。您可以稍微缓解这种情况,而不是在您的构建中包含开发环境 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,则根本不需要 therubyracergem,因为该操作系统已经捆绑了 Apple JavaScriptCore,它自己的 Javascript 运行程序。在最初回答时,我在雪豹上,因此需要它。

于 2012-12-05T00:15:57.780 回答
4

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

于 2014-04-19T04:59:28.280 回答
3

OSX 10.8.2,红宝石 1.9.3p125

以上都不适合我...我厌倦了为我的环境寻找合适的宝石,所以我只是软链接到 g++ 目标,这些东西丢失了:

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

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

于 2012-12-08T04:21:33.060 回答
1

我遇到了类似的问题,但它也抱怨找不到 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

于 2013-12-19T18:10:06.840 回答
0

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

  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

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

这是在 Mac 10.6 (Snow Leopard) 上。

于 2012-12-07T00:55:04.233 回答