gcc - 修复 Mavericks 上的 ruby​​racer/libv8 (0.12.1) 安装

标签 gcc rubygems v8 therubyracer libv8

好的,我对此束手无策。有几个类似的问题,但都是指rubyracer 0.10,他们大多得出结论,问题可以通过升级到0.12来解决。

我遇到了类似的问题,但是当我使用 0.12 时。

类似问题

  • Installing libv8 gem on Mavericks
  • How to fix libv8 error from Gemfile on Mavericks?

  • 我在使用“标准”(xcode?)gcc 以及来自 homebrew 的 apple-gcc42 和 gcc 时遇到问题。我试过 --with-system-v8--without-system-v8 ,同样,没有骰子。

    这是一些日志:

    从头开始…
     $ cd ~/Documents/code/website
     $ rvm gemset empty
     $ ruby -v
     ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin10.8.0]
     $ grep rubyracer Gemfile
     gem 'therubyracer', '~> 0.12.0'
     $ brew list | grep v8
     $ cat ~/.bundle/config 
     $ cat .bundle/config 
     BUNDLE_BIN: bin
     $ $CXX
     $ $CPP
     $ $CC
     $ which gcc
     /usr/bin/gcc
     $ which g++
     /usr/bin/g++
     $ g++ -v
     Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with- 
     gxx-include-dir=/usr/include/c++/4.2.1
     Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
     Target: x86_64-apple-darwin13.0.0
     Thread model: posix
    

    尝试捆绑安装
    Installing libv8 (3.16.14.3) 
    Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
    
        /Users/chris/.rvm/rubies/ruby-1.9.3-p448/bin/ruby extconf.rb 
    creating Makefile
    Compiling v8 for x64
    Using python 2.7.5
    Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
    Unable to find a compiler officially supported by v8.
    It is recommended to use GCC v4.4 or higher
    Using compiler: g++
    Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
    Unable to find a compiler officially supported by v8.
    It is recommended to use GCC v4.4 or higher
    ../src/cached-powers.cc:136:18: error: unused variable 'kCachedPowersLength' [-Werror,-Wunused-const-variable]
    static const int kCachedPowersLength = ARRAY_SIZE(kCachedPowers);
                     ^
    1 error generated.
    make[1]: *** [/Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/cached-powers.o] Error 1
    make: *** [x64.release] Error 2
    /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:36:in `block in verify_installation!': libv8 did not install properly, expected binary v8 archive '/Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_base.a'to exist, but it was not found (Libv8::Location::Vendor::ArchiveNotFound)
        from /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:35:in `each'
        from /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:35:in `verify_installation!'
        from /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:26:in `install!'
        from extconf.rb:7:in `<main>'
    GYP_GENERATORS=make \
        build/gyp/gyp --generator-output="out" build/all.gyp \
                      -Ibuild/standalone.gypi --depth=. \
                      -Dv8_target_arch=x64 \
                      -S.x64  -Dv8_enable_backtrace=1 -Dv8_can_use_vfp2_instructions=true -Darm_fpu=vfpv2 -Dv8_can_use_vfp3_instructions=true -Darm_fpu=vfpv3
      CXX(target) /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/allocation.o
      CXX(target) /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/atomicops_internals_x86_gcc.o
      CXX(target) /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/bignum.o
      CXX(target) /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/bignum-dtoa.o
      CXX(target) /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/cached-powers.o
    
    
    Gem files will remain installed in /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3 for inspection.
    Results logged to /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/gem_make.out
    
    An error occurred while installing libv8 (3.16.14.3), and Bundler cannot continue.
    

    艰难时期。

    错误消息提示建议使用 gcc 4.4+。我们能做到这一点。
    $ export CXX=/usr/local/Cellar/gcc48/4.8.2/bin/g++-4.8 
    $ export CPP=/usr/local/Cellar/gcc48/4.8.2/bin/cpp-4.8 
    $ export CC=/usr/local/Cellar/gcc48/4.8.2/bin/gcc-4.8 
    $ which $CXX
    /usr/local/Cellar/gcc48/4.8.2/bin/g++-4.8
    $ which $CPP
    /usr/local/Cellar/gcc48/4.8.2/bin/cpp-4.8
    $ which $CC
    /usr/local/Cellar/gcc48/4.8.2/bin/gcc-4.8
    $ bundle install
    …
    Installing libv8 (3.16.14.3) 
    Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
    
            /Users/chris/.rvm/rubies/ruby-1.9.3-p448/bin/ruby extconf.rb 
    creating Makefile
    Compiling v8 for x64
    Using python 2.7.5
    Using compiler: /usr/local/Cellar/gcc48/4.8.2/bin/g++-4.8
    g++-4.8: error: unrecognized command line option '-Wnewline-eof'
    make[1]: *** [/Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/allocation.o] Error 1
    make: *** [x64.release] Error 2
    /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:36:in `block in verify_installation!': libv8 did not install properly, expected binary v8 archive '/Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_base.a'to exist, but it was not found (Libv8::Location::Vendor::ArchiveNotFound)
        from /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:35:in `each'
        from /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:35:in `verify_installation!'
        from /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/location.rb:26:in `install!'
        from extconf.rb:7:in `<main>'
    GYP_GENERATORS=make \
        build/gyp/gyp --generator-output="out" build/all.gyp \
                      -Ibuild/standalone.gypi --depth=. \
                      -Dv8_target_arch=x64 \
                      -S.x64  -Dv8_enable_backtrace=1 -Dv8_can_use_vfp2_instructions=true -Darm_fpu=vfpv2 -Dv8_can_use_vfp3_instructions=true -Darm_fpu=vfpv3
      CXX(target) /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/vendor/v8/out/x64.release/obj.target/preparser_lib/src/allocation.o
    
    
    Gem files will remain installed in /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3 for inspection.
    Results logged to /Users/chris/.rvm/gems/ruby-1.9.3-p448@website/gems/libv8-3.16.14.3/ext/libv8/gem_make.out
    
    An error occurred while installing libv8 (3.16.14.3), and Bundler cannot continue.
    Make sure that `gem install libv8 -v '3.16.14.3'` succeeds before bundling.
    

    更糟的时候!

    好的。所以为了解决 therubyracer 0.10 的问题,有人建议 brew 安装 v8,然后告诉 ruby​​gems 使用 system v8。让我们看看发生了什么!
    $ brew install v8
    ==> Downloading https://github.com/v8/v8/archive/3.21.17.tar.gz
    Already downloaded: /Library/Caches/Homebrew/v8-3.21.17.tar.gz
    ==> Checking out http://gyp.googlecode.com/svn/trunk
    ==> make native -j4 library=shared snapshot=on console=readline i18nsupport=off
    🍺  /usr/local/Cellar/v8/3.21.17: 21 files, 27M, built in 3.4 minutes
    $ cat ~/.bundle/config 
    ---
    BUNDLE_BUILD__LIBV8: --with-system-v8
    $ bundle install
    …
    Installing therubyracer (0.12.1) 
    Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
    
            /Users/chris/.rvm/rubies/ruby-1.9.3-p448/bin/ruby extconf.rb 
    checking for main() in -lpthread... yes
    checking for main() in -lobjc... yes
    checking for v8.h... yes
    creating Makefile
    
    make
    compiling accessor.cc
    clang: warning: argument unused during compilation: '-rdynamic'
    In file included from accessor.cc:1:
    ./rr.h:463:14: error: no type named 'AccessorGetter' in namespace 'v8'
      inline v8::AccessorGetter accessorGetter() {return &AccessorGetter;}
             ~~~~^
    ./rr.h:464:14: error: no type named 'AccessorSetter' in namespace 'v8'
      inline v8::AccessorSetter accessorSetter() {return RTEST(set) ? &AccessorSetter : 0;}
             ~~~~^
    ./rr.h:466:14: error: no type named 'NamedPropertyGetter' in namespace 'v8'
      inline v8::NamedPropertyGetter namedPropertyGetter() {return &NamedPropertyGetter;}
             ~~~~^
    ./rr.h:467:14: error: no type named 'NamedPropertySetter' in namespace 'v8'
      inline v8::NamedPropertySetter namedPropertySetter() {return RTEST(set) ? &NamedPropertySetter : 0;}
             ~~~~^
    ./rr.h:468:14: error: no type named 'NamedPropertyQuery' in namespace 'v8'
      inline v8::NamedPropertyQuery namedPropertyQuery() {return RTEST(query) ? &NamedPropertyQuery : 0;}
             ~~~~^
    ./rr.h:469:14: error: no type named 'NamedPropertyDeleter' in namespace 'v8'
      inline v8::NamedPropertyDeleter namedPropertyDeleter() {return RTEST(deleter) ? &NamedPropertyDeleter : 0;}
             ~~~~^
    ./rr.h:470:14: error: no type named 'NamedPropertyEnumerator' in namespace 'v8'
      inline v8::NamedPropertyEnumerator namedPropertyEnumerator() {return RTEST(enumerator) ? &NamedPropertyEnumerator : 0;}
             ~~~~^
    ./rr.h:472:14: error: no type named 'IndexedPropertyGetter' in namespace 'v8'
      inline v8::IndexedPropertyGetter indexedPropertyGetter() {return &IndexedPropertyGetter;}
             ~~~~^
    ./rr.h:473:14: error: no type named 'IndexedPropertySetter' in namespace 'v8'
      inline v8::IndexedPropertySetter indexedPropertySetter() {return RTEST(set) ? &IndexedPropertySetter : 0;}
             ~~~~^
    ./rr.h:474:14: error: no type named 'IndexedPropertyQuery' in namespace 'v8'
      inline v8::IndexedPropertyQuery indexedPropertyQuery() {return RTEST(query) ? &IndexedPropertyQuery : 0;}
             ~~~~^
    ./rr.h:475:14: error: no type named 'IndexedPropertyDeleter' in namespace 'v8'
      inline v8::IndexedPropertyDeleter indexedPropertyDeleter() {return RTEST(deleter) ? &IndexedPropertyDeleter : 0;}
             ~~~~^
    ./rr.h:476:14: error: no type named 'IndexedPropertyEnumerator' in namespace 'v8'
      inline v8::IndexedPropertyEnumerator indexedPropertyEnumerator() {return RTEST(enumerator) ? &IndexedPropertyEnumerator : 0;}
             ~~~~^
    ./rr.h:482:16: error: no type named 'AccessorInfo' in namespace 'v8'; did you mean 'Accessor'?
        Info(const v8::AccessorInfo& info);
                   ^~~~~~~~~~~~~~~~
                   Accessor
    ./rr.h:456:7: note: 'Accessor' declared here
    class Accessor {
          ^
    ./rr.h:488:18: error: no type named 'AccessorInfo' in namespace 'v8'; did you mean 'Accessor'?
        inline const v8::AccessorInfo* operator->() {return this->info;}
                     ^~~~~~~~~~~~~~~~
                     Accessor
    ./rr.h:456:7: note: 'Accessor' declared here
    class Accessor {
          ^
    ./rr.h:502:11: error: no type named 'AccessorInfo' in namespace 'v8'; did you mean 'Accessor'?
        const v8::AccessorInfo* info;
              ^~~~~~~~~~~~~~~~
              Accessor
    ./rr.h:456:7: note: 'Accessor' declared here
    class Accessor {
          ^
    ./rr.h:506:85: error: no type named 'AccessorInfo' in namespace 'v8'; did you mean 'Accessor'?
      static v8::Handle<v8::Value> AccessorGetter(v8::Local<v8::String> property, const v8::AccessorInfo& info);
                                                                                        ^~~~~~~~~~~~~~~~
                                                                                        Accessor
    ./rr.h:456:7: note: 'Accessor' declared here
    class Accessor {
          ^
    ./rr.h:507:96: error: no type named 'AccessorInfo' in namespace 'v8'; did you mean 'Accessor'?
      static void AccessorSetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo& info);
                                                                                                   ^~~~~~~~~~~~~~~~
                                                                                                   Accessor
    ./rr.h:456:7: note: 'Accessor' declared here
    class Accessor {
          ^
    ./rr.h:509:90: error: no type named 'AccessorInfo' in namespace 'v8'; did you mean 'Accessor'?
      static v8::Handle<v8::Value> NamedPropertyGetter(v8::Local<v8::String> property, const v8::AccessorInfo& info);
                                                                                             ^~~~~~~~~~~~~~~~
                                                                                             Accessor
    ./rr.h:456:7: note: 'Accessor' declared here
    class Accessor {
          ^
    ./rr.h:510:118: error: no type named 'AccessorInfo' in namespace 'v8'; did you mean 'Accessor'?
      static v8::Handle<v8::Value> NamedPropertySetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo& info);
                                                                                                                         ^~~~~~~~~~~~~~~~
                                                                                                                         Accessor
    ./rr.h:456:7: note: 'Accessor' declared here
    class Accessor {
          ^
    fatal error: too many errors emitted, stopping now [-ferror-limit=]
    20 errors generated.
    make: *** [accessor.o] Error 1
    
    
    Gem files will remain installed in /Users/chris/.rvm/gems/ruby-1.9.3-p448/gems/therubyracer-0.12.1 for inspection.
    Results logged to /Users/chris/.rvm/gems/ruby-1.9.3-p448/gems/therubyracer-0.12.1/ext/v8/gem_make.out
    
    An error occurred while installing therubyracer (0.12.1), and Bundler cannot continue.
    Make sure that `gem install therubyracer -v '0.12.1'` succeeds before bundling.
    

    完全摸不着头脑,已经浪费了几个小时。如果你能发现问题所在并帮助我解决它,你将永远是我的英雄(ine)。

    最佳答案

    我可以在 rm Gemfile.lock 之后继续使用 ruby​​ Racer也许试试这个,这比 RVM nuke 选项更容易。

    预先:
    我通过 brew install v8 安装了 v8 ,然后做了 gem install libv8 -v '3.16.14.3' -- --with-system-v8
    我正在运行 10.10 Yosemite

    关于gcc - 修复 Mavericks 上的 ruby​​racer/libv8 (0.12.1) 安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22481435/

    相关文章:

    C++:什么 GNU G++ 参数?

    node.js - nodejs的任何反模式?

    c++ - v8::Isolate::New 空访问冲突

    gcc - 如何在 Beaglebone Black 上编译 openssl 1.0.2f?

    c++ - 为什么 GCC 优化掉这个增量?

    gccgo 4.9.2 动态链接器错误 : undefined reference to `sync..import'

    ruby - 为什么要从 gemspec 文件中排除测试?

    ruby - 如何将 SASS/Compass 放入 DDEV Web 容器?

    ruby - 创建 Ruby gem 的规范机制是什么?

    ruby - 如何在新安装的 Mountain Lion 上安装 libv8 ruby​​ gem?