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.

Другие вопросы по тегам