Ruby 1.8.7:符号未找到错误

5

我在一台使用RVM的机器上,对于全新的gem集合,分别进行了ruby 1.8.7 REE和MRI的全新安装。然而,在尝试使用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。我的问题是:我需要做什么才能让系统找到这个符号,或者我需要安装其他东西吗?欢迎任何调试建议。

庆祝一下模糊的标签[symbol]。 - Andrew Grimm
1
我已经在元问题中发布了一个关于标签的问题:http://meta.stackexchange.com/questions/110399/how-should-the-symbols-tags-be-split-up - Andrew Grimm
2个回答

3
这是我在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 (用-bundle和-bundleloader选项替换-dynamiclib)
然后运行:
make install
(这会创建memprof.bundle并将其复制到memprof*/lib)
注意:$(RUBY)必须包含ruby解释器(可执行文件)的完整路径名。在RVM下,Makefile会将其初始化为适当的解释器,因此上述行可以正常工作。

谢谢你的回复,我一有机会就会试试。上面的更改究竟是在做什么? - Schneems
2
-bundle 命令创建一个 bundle,这是一种 Mac 特有的动态库格式。memprof bundle 中包含对主程序(即 Ruby 解释器)中符号的引用。-bundle_loader 选项指向将要加载此 bundle 的特定可执行文件。 - Sriram Srinivasan

1

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

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


我尝试使用rvm export命令并加上两个标志,但仍然出现错误。也许这不是正确的命令? - Schneems
“rvm export” 似乎是用于管理 gemset,而不是更改编译设置的。首先尝试删除 memprof,然后执行 “LDFLAGS =” -bundle“gem install memprof”,如果这样不起作用,请尝试以相同方式构建 ruby(设置 LDFLAGS)...从回溯中无法清楚地看出哪个正在尝试使用 bundle。我认为实际上是在加载 gem 本身时尝试使用 ruby。 - d11wtq
尝试了 LDFLAGS="-bundle" gem install memprofLDFLAGS="-bundle" rvm install 1.8.7,但两者都没有成功。 - Schneems

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接