在Mac OS X Lion上安装`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
  • ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0](通过rvm安装)
  • V8版本3.9.24(通过homebrew安装)

注意:我曾希望http://wellconsidered.be/post/18996655760/therubyracer-compile-error-osx-10-7-lion会有所帮助,但事实并非如此。 - David J.
11个回答

106

1
我使用的是ruby 1.9.3p194版本,但这个方法不起作用。出现了“make: g++-4.2: No such file or directory”的错误提示。 - jspooner
很抱歉,这个对我没用,以下是我得到的信息: 错误:安装 therubyracer 失败 ERROR: Failed to build gem native extension./Users/lionel_lei/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb 检查 -lobjc 是否存在 main()... 是的 创建 Makefilemake 正在编译 rr.cpp make: clang++:没有这样的文件或目录 make:*** [rr.o] 错误 1 - lionel
1
@lionel,你能否发布一个Gist,详细说明你尝试过的内容?你是否尝试从头开始设置新的rbenvrvm安装,并记录下步骤(在Gist中)以隔离问题?你是否先执行了brew install v8 - David J.
我将therubyracer的版本设置为“0.11.4”,这很有帮助。默认的therubyracer版本解决方案恰好是“0.9.x”,它与“libv8”的可用版本存在问题。 - Priya Ranjan Singh
对于Rails来说,这里的第二步应该是在卸载libv8后运行"bundle install"。同时确保在你的gemfile中加入"gem "therubyracer", :require => 'v8'"。 - concept47
显示剩余3条评论

43
gem uninstall libv8
brew install v8
gem install therubyracer

谢谢Ken。安装大约花了3-5分钟。一切正常,使用的是therubyracer-0.11.2,它自动安装了libv8-3.11.8.13。 - scarver2

40

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

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

probably lack of necessary libraries and/or headers

写这个错误信息的人做出了错误的假设。在底部,您可以看到Ruby对此的看法:

undefined method `include_path' for Libv8:Module

在我的情况下,我试图使用 bundle install 安装 therubyracer-0.9.8,但出现了一些问题。它似乎想使用我安装的某个时候(可能是作为其他 gem 的依赖项)的 libv8-3.11.8.13 版本。

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

事实上,libv8-3.11.8.13 中的 Libv8:Module 并没有 include_path 方法,但在 libv8-3.3.10.2 中有这个方法。

因此,卸载所有版本的 libv8,然后重新安装 therubyracer 是有效的。因为所有没有 include_path 方法的 libv8 版本都被完全移除了,并且在重新安装 therubyracer 时,具有 include_path 方法的 libv8 版本会重新安装。


2
感谢您抽出时间为这个工作原理编写解释。 - concept47
如果我不想删除较新版本的libv8,以防其他项目依赖它,那我该怎么办?那我该怎么办? - Magne
找到了!检查了我的 Gemfile,发现它不需要特定的 therubyracer 版本。然后我删除了旧的 Gemfile.lock,其中指定了旧的 therubyracer 版本,而该版本又需要旧的 libv8 版本。(可能是之前有人将其提交到项目中,然后在安装时 bundle install 尝试使用它。)当我再次运行 bundle install 时,它生成了一个新的 Gemfile.lock,具有新的连接,并将最新的 therubyracer 版本与最新的 libv8 版本连接起来,没有问题。 - Magne

15

考虑到以上方法都没有完全解决我的问题,我想分享一下我是如何解决的(作为Rails项目的一部分):

gem uninstall libv8
bundle update therubyracer

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


它是唯一在OSX 10.9.1(Maverick)上帮到我的。 - Artur79
请问为什么我每次需要部署一个特定的应用程序时都必须运行这个命令?我正在使用 Mac。 - Som Poddar
除非您有几个宝石的版本并且正在使用Gemfile.lock进行某些奇怪的操作,否则不应该需要运行它超过一次。 - Abe Petrillo
这对我有用,Rails 4,Mac OS 10.9.4。感谢大家的帮助。 - David Routen

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 Mountain Lion


1
我尝试了这个,但是出现了以下错误: Gem::Installer::ExtensionBuildError: 错误:无法构建本地扩展的 gem。 /Users/lionel_lei/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb 检查 -lpthread 中的 main()... 是 检查 -lobjc 中的 main()... 是 创建 Makefilemake 编译 accessor.cc make: clang++: 没有那个文件或目录 make: *** [accessor.o] 错误 1我使用的是 Rails 3.2.6,ruby 1.9.3p194 (2012-04-20 revision 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

7

如果你在Mac OSX 10.8 Mountain Lion上尝试升级你的 Gemfile,并使用 gem 'therubyracer', '0.11.0' 遇到了问题,在不需要卸载其他任何 gem 的情况下,只需升级系统的 libv8 gem 就可以解决问题:

$ gem update libv8
$ bundle install

编辑

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

Gemfile

gem 'libv8', '3.11.8.3'

然后像往常一样运行bundle install。请注意,安装libv8可能需要相当长的时间,并且我注意到它可能会导致超过Travis CI的超时限制,从而导致构建失败。您可以通过在构建中不包括开发环境gems来稍微缓解这种情况: .travis.yml
# ...
bundler_args: --binstubs=./bundler_stubs --without development

更新

是的,几乎所有我的Travis构建都因此超时和失败。如果有人知道解决这个问题的方法(我希望“降级therubyracer”是最后的选择),请留言!

更新2

这可能并不适用于所有应用程序,但似乎我的Rails 3.2.9应用程序实际上并不需要therubyracerlibv8。在从我的Gemfile中删除这些gem之后,我确认我的规格已通过,再次推送到Travis并成功构建。因此,我猜想摆脱这些gem(如果您不确定是否真的需要它们)值得一试。

更新3

感谢Paul Annesley确认,如果您使用Mac OS X 10.8 Mountain Lion,则根本不需要therubyracer gem,因为该操作系统已捆绑了苹果JavaScriptCore,它自己的Javascript运行程序。在原始答案的时候,我使用的是Snow Leopard,因此需要它。


关于“更新2”和不需要therubyracerlibv8,这意味着您要么不使用CoffeeScript,要么使用替代的JS运行程序。 - Paul Annesley
我肯定使用Coffeescript。回头看看,我相信我是在将OS X从Snow Leopard升级到Mountain Lion后不久进行了编辑,因此也许Mountain Lion有自己的JS运行程序,这使得“therubyracer”变得不必要了...? - Paul Fioravanti
1
啊,是的,“Apple JavaScriptCore - Included with Mac OS X”被列为https://github.com/sstephenson/execjs/blob/master/README.md上的运行时之一。 - Paul Annesley
非常感谢您的确认。我已将其添加到答案中。 - Paul Fioravanti
由于某种原因,每次我在本地运行一个应用程序时,都必须运行此命令。有人能解释一下为什么我必须每次运行它而不是只运行一次吗? - Som Poddar

4
对于我来说,删除Gemfile.lock文件并运行bundle install就可以解决问题了。

1
请注意,运行 bundle update 实际上相当于删除 Gemfile.lock 然后运行 bundle install - GMA

3

操作系统:OSX 10.8.2,Ruby版本:1.9.3p125。

上述方法对我都没有效果...我已经厌倦了为我的环境寻找正确的gem,所以我只是将缺少的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++,然后再次尝试bundle install……它成功了! $ cd /usr/bin $ sudo ln -s g++ g++-4.2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接