Простое расширение 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,

Другие вопросы по тегам