Простое расширение Ruby C не может найти ruby.h
Я написал невероятно простое расширение C для Ruby. К сожалению, не могу найти 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
Полная суть. Обратите внимание, что номера строк отключены, потому что я в основном закомментировал код, а не удалял его.
Интересно, что если я попытаюсь скомпилировать снова без очистки, я получу другую ошибку:
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
? Когда я компилирую NMatrix или вилку SciRuby rb-gsl, оба они работают нормально и не имеют проблем с поиском ruby.h
, (Для справки, я написал NMatrix, расширение C и все - и я основал это конкретное расширение на этом extconf.rb
.)
1 ответ
Ответ был поразительно прост.
У меня была строчка в моем 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
,