Выдает сборку родного расширения ruby

Я создал некоторый код в c, который я хотел бы вызвать из ruby. Я использовал эту статью в качестве руководства, но у меня возникли проблемы с запуском без связывания проблем.

Для начала мне нужно напрямую скопировать исходные файлы в мой ext/NAME/ каталог. Похоже, они не будут подхвачены, если я добавлю их в этот каталог, то есть они будут в каком-то подкаталоге, например ext/NAME/CLIB_GIT_SUBMODULE_FILES/,

Затем кажется, что мне нужно запустить make-файл моих проектов, в противном случае я сталкиваюсь с segfaults. Если я запускаю свой make-файл, объектные файлы (.o) созданы в ext/NAME каталог, и теперь, когда я пытаюсь запустить грабли (который запускает мои тестовые случаи под /test/ Я вижу ссылки на такие вопросы, как:

linking shared-object NAME/NAME.so
gcc: error: SOMEFILE_ONE.o: No such file or directory
gcc: error: SOMEFILE_TWO.o: No such file or directory
gcc: error: SOMEFILE_THREE.o: No such file or directory
make: *** [ruby_fast_numerizer.so] Error 1
rake aborted!

Обратите внимание, что когда я запускаю make-файл под ext/NAME/ это создает SOMEFILE_ONE.o, так далее.

Я не уверен, что происходит в данный момент:(Кажется, что все руководства пишут новый код c в ext/NAME каталог, не упаковывая существующую библиотеку c. Я пытался смотреть на другие проекты в качестве руководства, как nokogiri, но они делают намного больше, что затрудняет их поиск.

Любая помощь высоко ценится!

1 ответ

Решение

Строим расширение

Обычно, ext/NAME/extconf.rb использования mkmf (MakeMakefile), чтобы написать новый Makefile со всей конфигурацией для построения расширения Ruby из предоставленных источников. MakeMakefile имеет значения по умолчанию для того, где найти исходный код, заголовки и все остальные части, но вы можете переопределить их (используя dir_config например).

Сгенерированный Makefile будет содержать инструкции для компиляции исходных файлов и связывания всего с соответствующими библиотеками Ruby для создания собственного расширения Ruby.

Если у вас есть библиотека C, которая не имеет ничего общего с Ruby, возможно, у нее есть собственный Makefile и процесс сборки. Не путайте созданный Ruby Makefile со своим собственным!

Загрузка библиотеки

Для упаковки существующей библиотеки C я бы вообще не создавал собственное расширение, а вместо этого загружал библиотеку с помощью FFI. Два основных варианта FFI - Fiddle (поставляется с Ruby, но учебных пособий мало) или ffi драгоценный камень (лучше задокументирован, но требует драгоценного камня).

Дополнительные ресурсы

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