Чем отличается Ruby от стандартного дистрибутива OS X, RVM и MacPorts?
Я задал вопрос на SuperUser об обновлении версии Ruby в Google SketchUp. Кажется, что-то отличное между Ruby, поставляемым со стандартным дистрибутивом OS X, и Ruby, установленным RVM или MacPorts. При попытке использовать RVM или MacPorts Ruby 1.9.1 появляется следующее сообщение об ошибке
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Dyld Error Message:
Library not loaded: @executable_path/../Frameworks/Ruby.framework/Versions/A/Ruby
Referenced from: /Applications/Google SketchUp 7/SketchUp.app/Contents/MacOS/SketchUp
Reason: no suitable image found. Did find:
/Applications/Google SketchUp 7/SketchUp.app/Contents/MacOS/../Frameworks/Ruby.framework/Versions/A/Ruby: mach-o, but wrong architecture
/Applications/Google SketchUp 7/SketchUp.app/Contents/MacOS/../Frameworks/Ruby.framework/Versions/A/Ruby: mach-o, but wrong architecture
/usr/lib/Ruby: not a file
Model: MacBookPro7,1, BootROM MBP71.0039.B05, 2 processors, Intel Core 2 Duo, 2.4 GHz, 4 GB, SMC 1.62f5
Но это работает с Ruby 1.8.7 из /System/Library/Frameworks/Ruby.framework/
Update1
Как объяснил Алекс, мне нужно скомпилировать Ruby с i386
архитектура. Можно сделать это для MacPorts и RVM, но ни один из методов не работал для меня из-за различных ошибок.
- Как предвидеть сборку i386 на макпортах снежного барса?
- Внутренние конфигурационные файлы
- Дарвин О.С.
Поэтому я решил скомпилировать Ruby 1.9.2-rc2
из источников
$ ARCHFLAGS="-arch i386" CFLAGS="-arch i386" LDFLAGS="-arch i386" ./configure --with-arch=i386
$ make && sudo make install
и скопируйте соответствующие файлы в SketchUp
$ cd /Applications/Google\ SketchUp\ 7/SketchUp.app/Contents/Frameworks/Ruby.framework/Versions/A/
$ rm -r Headers Ruby
$ cp /usr/local/bin/ruby Ruby
$ mkdir Headers
$ cp /usr/local/include/ruby-1.9.1/i386-darwin10.4.0/ruby/config.h Headers/
$ cp /usr/local/include/ruby-1.9.1/ruby.h Headers/
$ cp -r /usr/local/include/ruby-1.9.1/ruby/* Headers/
$ ls Headers
backward/ defines.h dl.h intern.h missing.h re.h ruby.h util.h vm.h
config.h digest.h encoding.h io.h oniguruma.h regex.h st.h version.h
На этот раз я получил следующее сообщение
Dyld Error Message:
Library not loaded: @executable_path/../Frameworks/Ruby.framework/Versions/A/Ruby
Referenced from: /Applications/Google SketchUp 7/SketchUp.app/Contents/MacOS/SketchUp
Reason: no suitable image found. Did find:
/Applications/Google SketchUp 7/SketchUp.app/Contents/MacOS/../Frameworks/Ruby.framework/Versions/A/Ruby: can't map
/Applications/Google SketchUp 7/SketchUp.app/Contents/MacOS/../Frameworks/Ruby.framework/Versions/A/Ruby: can't map
/usr/local/lib/Ruby: not a file
/usr/lib/Ruby: not a file
2 ответа
Похоже, у вас есть версии Ruby
библиотека в каталогах SketchUp для двух архитектур (вероятно, 32-разрядная Intel и PPC, я думаю) и пытающихся использовать двоичный файл Ruby, построенный из третьей и другой архитектуры (вероятно, 64-разрядная Intel, я думаю), Вы можете проверить с arch
команда в командной строке Terminal.App.
Если это действительно должно быть проблемой, вы могли бы попытаться собрать 1,9 рубин из источников, предназначенных для 32-битных процессоров Intel...? (Я не знаю ни одного готового Ruby 1.9 для Mac, созданного для 32-битных процессоров Intel - конечно, могут быть некоторые, о которых я не знаю!-).
Было ли это решено? Чтобы ответить на общий вопрос в вашем заголовке, вот почему я нажал на это:
Система Ruby (1.8.7, я думаю) поставляется с предустановленной версией и не перезаписывается MacPorts или RVM. MacPorts записывает по умолчанию в другой каталог, и Terminal начинает преобразовываться в эту новую установку, оставляя системный Ruby неиспользованным. RVM создает свои собственные виртуальные установки Ruby и может переключаться между ними и системой Ruby, используя $ rvm use
,