Ruby 1.8.7: символ не найден Ошибка
Только что сделал новую установку ruby 1.8.7 REE и MRI на машине со свежими наборами драгоценных камней (используя RVM). Но в каждом из них, когда я пытаюсь использовать memprof, я получаю эту ошибку
$ gem install memprof
$ irb
>> require 'rubygems'
>> require 'memprof'
>> LoadError: dlopen(/Users/schneems/.rvm/gems/ruby-1.8.7-p352@test/gems/memprof-0.3.10/lib/memprof.bundle, 9): Symbol not found: __mh_bundle_header
Referenced from: /Users/schneems/.rvm/gems/ruby-1.8.7-p352@test/gems/memprof-0.3.10/lib/memprof.bundle
Expected in: flat namespace
in /Users/schneems/.rvm/gems/ruby-1.8.7-p352@test/gems/memprof-0.3.10/lib/memprof.bundle - /Users/schneems/.rvm/gems/ruby-1.8.7-p352@test/gems/memprof-0.3.10/lib/memprof.bundle
from /Users/schneems/.rvm/gems/ruby-1.8.7-p352@test/gems/memprof-0.3.10/lib/memprof.bundle
from /Users/schneems/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:59:in `require'
from (irb):2
Ошибка Symbol not found: __mh_bundle_header
, У меня такой вопрос: что мне нужно сделать, чтобы моя система нашла этот символ, или мне нужно установить что-то еще? Любые предложения по отладке приветствуются.
2 ответа
Вот что я сделал, чтобы заставить его работать на Snow Leopard:
cd ..../gems/memprof-0.3.10/ext/
Редактировать Makefile, искать LD_SHARED=
Меняться от
LDSHARED = cc -arch x86_64 -dynamiclib -undefined suppress -flat_namespace
в
LDSHARED = cc -arch x86_64 -bundle -bundle_loader $(RUBY) -undefined suppress -flat_namespace
(заменил -dynamiclib на опции -bundle и -bundleloader)
Затем,
make install
(который создает memprof.bundle и копирует его в memprof*/lib)
Изменить: просто чтобы уточнить, $(RUBY)
должен содержать полный путь к интерпретатору ruby (исполняемый файл). Под RVM Makefile инициализирует его для соответствующего интерпретатора, поэтому приведенная выше строка работает без проблем.
Похоже, что он не был скомпилирован правильно и отсутствовали флаги компоновщика для библиотеки комплектов. Попробуйте построить это было LDFLAGS="-bundle"
... Я не уверен, как вы делаете это с RVM, но я предполагаю, что он унаследует среду, которую вы ему предоставляете.
РЕДАКТИРОВАТЬ | Извините, похоже, правильный флаг ld может быть: LDFLAGS="-bundler_loader"
РЕДАКТИРОВАТЬ 2 | На самом деле, я не уверен, если это bundle
или же bundle_loader
... Я вижу оба в результатах Google.