Ruby 1.8.7: символ не найден Ошибка - PullRequest
5 голосов
/ 26 октября 2011

Только что сделал новую установку 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 ]

3 голосов
/ 31 октября 2011

Это то, что я сделал, чтобы заставить его работать на 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 инициализирует его для соответствующего интерпретатора, поэтому приведенная выше строка работает без проблем.

1 голос
/ 27 октября 2011

Похоже, что он не был скомпилирован правильно и отсутствовали флаги компоновщика для библиотеки комплектов.Попробуйте построить это было LDFLAGS="-bundle" ... Я не уверен, как вы делаете это с RVM, но я предполагаю, что он унаследует среду, которую вы ему даете.

РЕДАКТИРОВАТЬ |Извините, похоже, правильный флаг ld может быть: LDFLAGS="-bundler_loader" РЕДАКТИРОВАТЬ 2 |На самом деле, я не уверен, что это bundle или bundle_loader ... Я вижу оба в результатах Google.

...