【问题标题】:How to compile Ruby Extension如何编译 Ruby 扩展
【发布时间】:2012-11-22 21:55:59
【问题描述】:

我在 ext/Q/flagvalue.c 中有一个简单的扩展

我的 ext/Q/extconfig.rb 看起来像这样:

require 'mkmf'
create_makefile('Q/flagvalue')

Rakefile 中的任务是这样设置的:

Rake::ExtensionTask.new("Q") do |extension|
  extension.lib_dir = 'lib/Q'
end

当我rake build 时,我得到以下输出:

mkdir -p tmp/x86_64-linux/Q/1.9.3
cd tmp/x86_64-linux/Q/1.9.3
/usr/local/rvm/rubies/ruby-1.9.3-p286/bin/ruby -I。 ../../../../ext/Q/extconf.rb
创建 Makefile
光盘 -
cd tmp/x86_64-linux/Q/1.9.3
制作
编译../../../../ext/Q/flagvalue.c
链接共享对象 Q/flagvalue.so
光盘 -
安装 -c tmp/x86_64-linux/Q/1.9.3/Q.so lib/Q/Q.so
耙中止!
没有这样的文件或目录 - tmp/x86_64-linux/Q/1.9.3/Q.so

所以看起来编译器编译并链接 flagvalue.so 并且安装程序尝试安装不存在的 Q.so...这个错误来自哪里以及什么我能做些什么吗?

【问题讨论】:

    标签: ruby gem rake rakefile


    【解决方案1】:

    在您的 Rakefile 中试试这个:

    Rake::ExtensionTask.new 'flagvalue' do |extension|
      extension.ext_dir = 'ext/Q'
      extension.lib_dir = 'lib/Q'
    end
    

    这确实需要一些重复,因为 Rake 任务不知道您在 extconf 中指定的目标(即它不知道 Q 目录),因此您必须再次指定。这也意味着任务在您的项目的tmp 目录下创建的结构中不会有Q 目录,但这可能不是问题。

    【讨论】:

      【解决方案2】:

      好的,经过一番挖掘(以及一些模糊的猜测:-Δ)我找到了解决方案:

      我刚刚获得了一些用于我的 gemspec 的代码(来自 Writehack.com),就是这样:

      s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
      

      这种方法的问题是你必须在你的存储库中已经有了刚刚编译的二进制文件。正确的方法是从 ext-directory 获取 *.c 文件并将它们重命名为 *.so,如下所示:

      s.executables   = s.files.grep(%r{^ext/.*c$}).map{ |f| File.basename(f, '.c') + '.so'}
      s.bindir        = 'bin'
      

      并且还在Rakefile的ExtensionTask 中添加一个bindir,让它从spec 中获取它的文件:

      spec = Gem::Specification.load('Q.gemspec')
      spec.executables.each do |f|
        Rake::ExtensionTask.new('Q', spec) do |ext|
          ext.name    = f.gsub(/\.so$/,'')
          ext.tmp_dir = 'tmp'
          ext.lib_dir = 'bin'
        end
      end
      

      :-Δ

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多