【问题标题】:Ruby 1.8.7: Symbol not found ErrorRuby 1.8.7:找不到符号错误
【发布时间】:2011-12-16 00:14:28
【问题描述】:

刚刚在具有新 gem 集的机器上重新安装了 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。我的问题是:我需要做什么才能让我的系统找到这个符号,还是我需要安装其他东西?欢迎任何调试建议。

【问题讨论】:

标签: ruby rubygems symbols memprof


【解决方案1】:

这就是我在 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 将其初始化为适当的解释器,因此上面的行没有问题。

【讨论】:

  • 感谢您的回复,我会尽快尝试。上面的变化到底是做什么的?
  • -bundle 创建一个包,一种特定于 mac 的动态库格式。 memprof 包引用了宿主程序 ruby​​ 解释器中的符号。 -bundle_loader 选项指向将要加载此捆绑包的特定可执行文件。
【解决方案2】:

看起来它没有正确编译并且缺少捆绑库的链接器标志。尝试使用 LDFLAGS="-bundle" 构建它...我不确定您如何使用 RVM 进行此操作,但我认为它会继承您提供的环境。

编辑 |抱歉,看起来正确的 ld 标志可能是:LDFLAGS="-bundler_loader" 编辑 2 |实际上,我不确定是 bundle 还是 bundle_loader...我在 Google 搜索结果中都看到了。

【讨论】:

  • 我尝试将rvm export 与两个标志一起使用,但我仍然收到错误消息。也许那不是正确的命令?
  • rvm export 似乎用于管理 gemset,而不是用于更改编译设置。首先尝试删除 memprof,然后执行LDFLAGS="-bundle" gem install memprof,如果这不起作用,请尝试以相同的方式构建 ruby​​(设置 LDFLAGS)......从试图使用 bundle 的回溯中不清楚。我认为在尝试加载 gem 本身时它实际上是 ruby​​。
  • 试过 LDFLAGS="-bundle" gem install memprofLDFLAGS="-bundle" rvm install 1.8.7 都没有成功。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多