可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I would appreciate some help in getting gem install therubyracer
to work. Here is the error:
$ 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)
Here are some notable steps that I ran before the error. They worked fine:
$ gem install libv8
$ brew install v8
My environment is:
- Mac OS X Lion 10.7.4
- ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0] (via rvm)
- V8 version 3.9.24 (via homebrew)
回答1:
This worked for me:
$ gem uninstall libv8
$ gem install therubyracer
(A big thanks to http://www.ruby-forum.com/topic/4306127)
回答2:
gem uninstall libv8
brew install v8
gem install therubyracer
回答3:
But, why is this happening, you ask? And why does uninstalling libv8
and reinstalling therubyracer
fix the problem?
The answer is at the bottom of the error message (from orig post). Ignore the stuff about
probably lack of necessary libraries and/or headers
This is an incorrect assumption by whoever wrote that error message. At the bottom, you see what Ruby has to say about it:
undefined method `include_path' for Libv8:Module
In my case, I was trying to install therubyracer-0.9.8
with bundle install
, and for some reason, it was trying to use my copy of libv8-3.11.8.13
, which had been installed at some point, probably as a dependency of some other gem.
I don't know why it was trying to use the newer version, because therubyracer.gemspec
contains s.add_dependency "libv8", "~> 3.3.10"
. And my Gemfile.lock
says to use libv8 (3.3.10.2)
. But alas, that is indeed what was happening.
And it's true that Libv8:Module
does not have the method include_path
in libv8-3.11.8.13
, but it does in libv8-3.3.10.2
So that is why uninstalling all of your versions of libv8
and then re-installing therubyracer
works. Because all the versions of libv8
that do not have the method include_path
are removed completely, and the libv8
that does have the method include
path is reinstalled when you reinstall of therubyracer
.
回答4:
Considering none if the above worked for me 100%, I thought I'd post what did (as part of a rails project):
gem uninstall libv8
bundle update therubyracer
This made sure I got the latest therubyracer
, and also a more recent version of libV8
, and seem to fix the multiple issues I was hitting, from missing libv8.a files, to undefined methods.
回答5:
At last I use therubyracer 0.11.0beta5 as a solution.
Using therubyracer (0.11.0beta5)
add following on Gemfile
gem 'therubyracer', '~> 0.11.0beta5'
group :libv8 do
gem 'libv8', "~> 3.11.8"
end
then bundle install
Mac OSX 10.8 Moutain Lion
回答6:
If you need 0.11.3
and it's failing give this a shot for 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
See this issue for more details.
You probably don't need the -- --with-system-v8
on the last line but I did it just to be safe since I saw it start doing Fetching: libv8-3.11.8.17-x86_64-darwin-13.gem (1%)
when I ran the command...
Anyhow, it worked for me when all the other things did not.
回答7:
For anyone encountering this issue on Mac OSX 10.8 Mountain Lion when attempting to upgrade their Gemfile with gem 'therubyracer', '0.11.0'
, just upgrading the system libv8
gem worked for me (no uninstallation of any other gem necessary):
$ gem update libv8
$ bundle install
Edit
If you use Travis-CI (or other CI tools located on other servers, I assume), you will need to explicitly add the libv8
gem to your Gemfile as well:
Gemfile
gem 'libv8', '3.11.8.3'
then bundle install
as usual. Just note that libv8
can take a significant amount of time to install and I've noticed that it may end up being the cause of going over Travis CI's timeout limits, causing your build to fail. You can mitigate this slightly be not including development environment gems in your builds:
.travis.yml
# ...
bundler_args: --binstubs=./bundler_stubs --without development
Update
Yep, pretty much all my Travis builds timeout and fail because of this. If anyone knows a way to solve this problem (I would hope "downgrade therubyracer
" is a last resort), please leave a comment!
Update 2
This may not work for all apps, but it seems that my Rails 3.2.9 apps didn't actually need therubyracer
or libv8
after all. After removing those gems from my Gemfile, I confirmed that my specs passed, pushed again to Travis and it built successfully. So, I guess getting rid of those gems (if you're not sure you actually need them) is at least worth a try.
Update 3
Thanks to Paul Annesley for confirming that if you're on Mac OS X 10.8 Mountain Lion, you don't need therubyracer
gem at all since the OS already comes bundled with Apple JavaScriptCore, its own Javascript runner. At the time of the original answer, I was on Snow Leopard and hence needed it.
回答8:
For me, removing the Gemfile.lock file and running bundle install
worked it's magic.
回答9:
OSX 10.8.2, ruby 1.9.3p125
None of the above worked for me... I got tired of trying to find the right gem for my environment, so I just soft linked to the g++ target this things was missing:
sudo ln -s `which g++` /usr/bin/g++-4.2
Not as helpfully for remote deployments, but get the job done on my workstation.
回答10:
I got a similar issue, but it was also complaining about not finding g++-4.2. I did have XCode command line tools installed, but it was looking for /usr/bin/g++-4.2, I had g++ (which was a symbolic link pointing to llvm-g++-4.2). Anyway, I just created a symbolic link to g++ and tried the bundle install again... it worked!
$ cd /usr/bin
$ sudo ln -s g++ g++-4.2
回答11:
Had the same error, this worked for me:
From console: gem uninstall libv8
In your Gemfile, add the following:
gem 'therubyracer', :platforms => :ruby, :require => 'v8'
gem 'libv8', '~> 3.11.8' # Update version number as needed
From console: bundle install
If you were in the middle of upgrading therubyracer gem, you may want to run bundle update therubyracer
after that as well. (Consider specifying a version number)
This was on Mac 10.6 (Snow Leopard).