Вопрос по ruby, rubygems – Как обернуть расширение Ruby C в Ruby Gem?

9

Я могу'я не могу найти много документов по этому вопросу. Как мне упаковать гем, чтобы расширение C компилировалось, когда гем установлен?

В частности, я хочу сделать это:

на Linux и MacOSX я хотел бы скомпилировать расширение C при установке gem

на Windows я хотел бы просто установить предварительно скомпилированный .so

любая помощь в этом, в частности, пример источника, была бы очень полезна :)

Ваш Ответ

2   ответа
0

У меня есть репозиторий github, который я поддерживаю только для себя, и эти вещи мне помогли.

Ruby_C_extensions

Это может помочь взглянуть на github, чтобы найти несколько хороших примеров драгоценных камней, уже написанных только для вашего изучения, но вы можете клонировать их и посмотреть, сможете ли вы собрать их в своей системе. Если они были собраны правильно, они должны были бы просто хорошо сложиться.

Обратите внимание, что вам нужны инструменты для сборки на любой платформеповторное использование. Вот видео, которое я только что посмотрел, которое говорит вам, что вам нужно для Linux.

Настройка среды программирования Python

Теперь я знаю, что он говорит Python, он показывает вам, как установить пакеты инструментов сборки.

Я использую DevKit для Windows, и он работает для меня. С чем-нибудь самым важным является установка инструментов.

Я также использовал rake-compiler и hoe для настройки структуры папок. Похоже, нам нужно немного садиться, чтобы получить грабли и мотыгу. :-D

14

Луис Лавена создалrake-compiler только для этого.

домашняя страницаСтраница проектаПроект GitHubGitHub Wiki

Тем не менее, вы уверены, что вам нужно расширение C? Суть расширений C в том, что каждая реализация Ruby имеет свой собственный API расширений C (и не на основе C, такие как XRuby, JRuby, Ruby.NET, IronRuby, HotRuby, MagLev, Red Sun don ').вообще нет), это означает, что ваше расширение C будет работать только наодин реализация. И, так как МРТтолько реализует Ruby 1.8 и YARVтолько реализует Ruby 1.9, и в настоящее время мы находимся в переходной фазе между 1.8 и 1.9, есть вероятность, что многие люди будут использовать как минимум две разные реализации. (Я лично использую 5: МРТ, YARV, JRuby, IronRuby и Rubinius.)

Может быть, вам лучше использоватьРубин-FFI, Ruby-FFI - это FFI (Интерфейс внешних функций) для Ruby (Дух), который позволяет связывать и отображать библиотеки C в чистом Ruby способом, который переносим между реализациями Ruby. API FFI был впервые разработанЭван Феникс в качестве нативного расширения API дляRubiniusбыл принятЧарльз Оливер Наттер (и реализованоУэйн Мейснер) заJRuby.Wayne затем также написалРубин-FFI драгоценный камень, который содержит расширения C для MRI и YARV.Лоран Сансонетти реализовал Ruby-FFI дляMacRuby,Марк-Андре Cournoyer-хtinyrb такжеподдерживает FFI (снова написаноУэйн Мейснер) иMagLev разработчики также работают над этим. Это означает, что если вы можете заставить свою библиотеку работать с FFI, а не с расширением C, вы автоматически будете поддерживать 6 реализаций Ruby вместо одной.

Единственная причина использовать расширение C в отличие от расширения FFI, если вы действительноделать хочу некоторое поведение, специфичное для реализации. Одним из примеров этого будетParseTree гем, который проникает глубоко в кишечник МРТ и вырывает представление в памяти дерева разбора.

И последнее, но не менее важное: взгляните наNice-FFI проектДжон Круазан, который стремится сделать использованиеРубин-FFI еще приятнее.

Вы'Добро пожаловать! Кстати, это был полный эгоизм: я использую Ruby в Windows, поэтому, чем больше авторов расширений используют rake-компилятор, тем больше расширений публикуется для Windows! (Но см. Мое редактирование.) Jörg W Mittag
Похоже, этот ответ от09, и некоторые из ответов должны быть обновлены Tilo
вау, выглядит отлично! Спасибо :) horseyguy

Похожие вопросы