简单的Ruby C扩展无法找到ruby.h

时间:2013-06-21 21:57:41

标签: c ruby extconf.rb mkmf

我为Ruby编写了一个非常简单的C扩展。很遗憾,它无法找到ruby.h

以下是extconf.rb

require "mkmf"
$srcs = %w{hypergeometric.c}
$objs = %w{hypergeometric}
create_makefile("hypergeometric")

这是唯一的源文件:

#include <ruby.h> // have also tried #include "ruby.h", same error.
VALUE cHypergeometric;
void Init_hypergeometric() {
  cHypergeometric = rb_define_module("Hypergeometric");
}

当我尝试编译时,我收到以下错误:

../../../../ext/hypergeometric/hypergeometric.c:1:18: error: ruby.h: No such file or directory

Full gist.请注意,行号已关闭,因为我主要注释掉代码而不是删除代码。

有趣的是,如果我尝试再次编译而不进行清理,我会收到一个不同的错误:

ld: warning: ignoring file hypergeometric, file was built for unsupported file format ( 0x67 0x70 0x63 0x68 0x43 0x30 0x31 0x33 0x38 0x4b 0x73 0x92 0x3d 0xf1 0xa5 0x62 ) which is not the architecture being linked (x86_64): hypergeometric

(完整输出再次包含在上面的要点中。)

也许这是一个线索?

为什么找不到ruby.h?当我编译NMatrixthe SciRuby rb-gsl fork时,这两个工作都很正常,找到ruby.h没问题。 (为了记录,我写了NMatrix,C扩展和所有 - 我基于那个extconf.rb的特定扩展名。)

1 个答案:

答案 0 :(得分:0)

答案非常简单。

我在extconf.rb$objs = %w{hypergeometric}中有一行,我从另一个项目中复制了这一行。事实证明我错过了下半部分:

$objs = %w{hypergeometric}.map { |i| i + ".o" }

我无法理解为什么这种改变会让它突然发现ruby.h

最后,赠送的是那个奇怪的错误信息:

ld: warning: ignoring file hypergeometric, file was built for unsupported file format ( 0x67 0x70 0x63 0x68 0x43 0x30 0x31 0x33 0x38 0x4b 0x73 0x92 0x3d 0xf1 0xa5 0x62 ) which is not the architecture being linked (x86_64): hypergeometric

但奇怪的是,只有第二次时间才会运行bundle exec rake compile