Mac OS X Lion上的'gem install therubyracer'失败


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

注意:我希望wellconsidered.be/post/18996655760/…会有用,但是没有帮助。
David J.

Answers:


106

这为我工作:

$ gem uninstall libv8
$ gem install therubyracer

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


1
我在使用ruby 1.9.3p194,这没有用。“ make:g ++-4.2:无此类文件或目录”
jspooner 2012年

我尝试安装宝石的每种组合,但没有任何效果。我最终只是将gemdir从ruby1.9.2p125目录复制到新的p194目录。
jspooner 2012年

@jspooner对于许多人来说,这是一个相对棘手的安装过程。如果您愿意的话,请像我一样发表一个问题,详细说明您的配置设置,尝试的操作等等。
David J.

:(对我不起作用,这就是我得到的:错误:安装therubyracer时出错:错误:无法构建gem本机扩展。/Users/lionel_lei/.rvm/rubies/ruby-1.9.3-p194/bin/红宝石extconf.rb主()在-lobjc ...是创建的Makefile使编译rr.cpp化妆检查:铛++:没有这样的文件或目录化妆:*** [rr.o]错误1
梅西

1
@lionel您可以张贴您尝试过的内容的要点吗?您是否尝试过安装新产品rbenvrvm从头开始安装并写下步骤(按照要点)以找出问题所在?你先做brew install v8
David J.

43
gem uninstall libv8
brew install v8
gem install therubyracer

谢谢Ken。花了大约3-5分钟来安装。一切都与自动安装libv8-3.11.8.13的therubyracer-0.11.2一起使用。
scarver2 2013年

谢谢!对我来说就像一个魅力。
Dmytro Uhnichenko 2013年

40

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

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

probably lack of necessary libraries and/or headers

无论谁写该错误消息,这都是不正确的假设。在底部,您将看到Ruby对它的评价:

undefined method `include_path' for Libv8:Module

就我而言,我试图安装therubyracer-0.9.8使用bundle install,出于某种原因,有人试图用我的副本libv8-3.11.8.13,其中已经安装在某些时候,可能是因为其他一些宝石的依赖。

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

而这是真的,Libv8:Module不能有方法include_pathlibv8-3.11.8.13,但它确实libv8-3.3.10.2

因此,这就是为什么卸载所有版本libv8然后重新安装的原因therubyracer。因为所有的版本libv8没有做的方法include_path是完全去除,而libv8确实有方法include,当你重新安装的路径重新安装therubyracer


2
感谢您抽出
宝贵

如果我不想删除较新版本的libv8,如果其他项目依赖它怎么办?那我该怎么办?
Magne 2014年

找到了!检查了我Gemfile是否不需要特定的therubyracer版本。然后,我删除了旧Gemfile.lock版本,该旧版本指定了旧的therubyracer版本,而后者又需要旧libv8版本。(必须先有人将它提交到项目中,然后在安装时捆绑安装尝试使用它。)当我bundle install再次运行时,它Gemfile.lock使用新的连接进行了新的连接,并将最新therubyracer版本挂接到最新libv8版本,没问题。
Magne 2014年

15

如果上述方法对我100%都有效,那么我认为什么也没考虑,所以我认为应该发表一下(作为Rails项目的一部分):

gem uninstall libv8
bundle update therubyracer

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


这是唯一在osx 10.9.1(Maverick)上对我有帮助的人
Artur79

您能否解释一下为什么每次需要部署一个特定应用程序时都必须运行此命令。我正在使用Mac。
桑达

不需要多次运行吗?除非您有两个版本的gem,并且您对Gemfile.lock做的事情很奇怪?
安倍·佩特里罗

这对我来说做到了,Rails 4,Mac OS 10.9.4。感谢大家的帮助。
David Routen

12

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


1
我试过了,但是:Gem :: Installer :: ExtensionBuildError:错误:无法生成gem本机扩展。/Users/lionel_lei/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb检查-lpthread中的main()...是检查-lobjc中的main()...是创建Makefile make编译accessor.cc make:clang ++:没有这样的文件或目录make:*** [accessor.o]错误1我在Rails 3.2.6上,ruby 1.9.3p194(2012-04-20修订35410)[x86_64- darwin11.4.1],osx 10.7.4
lionel

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%)在执行命令时就开始执行了...

无论如何,当其他所有东西都不起作用时,它对我有用。


这对我也起作用,--with-system-v8在最后一行是强制性的
IanBussieres,2015年

7

对于任何试图自己升级的时候在Mac OSX 10.8山狮遇到此问题的Gemfilegem 'therubyracer', '0.11.0',只是系统升级libv8宝石为我工作(无需任何其他宝石的卸载):

$ 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应用程序实际上并不需要therubyracerlibv8毕竟没有。从我的Gemfile中删除了这些宝石之后,我确认我的规格通过了,再次推到Travis,它成功构建了。因此,我认为摆脱这些宝石(如果您不确定自己是否真正需要它们)至少值得一试。

更新3

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


关于“ Update 2”,不需要therubyracerlibv8,大概意味着您不是在使用CoffeeScript,还是在使用其他JS运行器。
Paul Annesley

我确实使用Coffeescript。回顾一下,我相信我是在将OS X从Snow Leopard升级到Mountain Lion之后不久就进行了此编辑的,所以Mountain Lion可能拥有自己的JS运行程序,因此therubyracer不必要...?
Paul Fioravanti 2013年


非常感谢您确认这一点。我已将其添加到答案中。
Paul Fioravanti

由于某种原因,每次我开始在本地运行一个应用程序时,都必须运行此命令。有人可以解释一下,为什么我每次都必须运行它,而不是一次。
桑达

4

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


1
请注意,运行bundle update实际上与删除Gemfile.lock然后运行相同bundle install
GMA 2015年

3

OSX 10.8.2,红宝石1.9.3p125

以上都不对我有用...我已经厌倦了试图为我的环境找到合适的宝石,所以我只是软链接到了g ++目标,而这一切都丢失了:

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

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


1

我遇到了类似的问题,但它也抱怨找不到g ++-4.2。我确实已经安装了XCode命令行工具,但是它正在寻找/usr/bin/g++-4.2,我已经有了g ++(这是指向llvm-g ++-4.2的符号链接)。无论如何,我只是创建了一个指向g ++的符号链接,然后再次尝试安装捆绑软件……它起作用了!

$ cd /usr/bin

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


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

如果您正在升级therubyracer宝石,则可能还需要这样做bundle update therubyracer。(考虑指定版本号)

这是在Mac 10.6(Snow Leopard)上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.