Выдает сборку родного расширения 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
драгоценный камень (лучше задокументирован, но требует драгоценного камня).
Дополнительные ресурсы
- RubyGems имеет официальное руководство по драгоценным камням с расширениями
- Сам Ruby поставляется с руководством по расширениям