Как я могу вызвать функции C ++ из рубина - PullRequest
32 голосов
/ 09 октября 2009

Я опытный разработчик C / C ++, но я новичок в Ruby.

Как я могу вызвать функцию C ++ из with в Ruby?

Ответы [ 4 ]

32 голосов
/ 09 октября 2009

У вас есть 3 возможности:

1) Ruby умеет загружать библиотеки. Даже если это немного сложно, вы можете написать собственный загрузчик и связать свою библиотеку C ++ в Ruby. Это делается с помощью так называемого модуля расширения . Вы найдете подробное руководство здесь: http://www.rubyinside.com/how-to-create-a-ruby-extension-in-c-in-under-5-minutes-100.html

2) Вы можете использовать инструмент , который сгенерирует оболочку Ruby вокруг вашей библиотеки C ++. Посмотрите на SWIG например (http://www.swig.org/). Вам просто нужно создать файл в синтаксисе, специфичном для swig, и предоставить его SWIG. Затем он сможет сгенерировать оболочку для многих языков, включая Ruby.

3) Вы можете использовать промежуточное программное обеспечение , такое как CORBA / ICE / что угодно. Это может быть немного излишним, если вы хотите вызывать только некоторые функции C ++, но это позволит вам удаленно вызывать функции или «скрывать» сетку за промежуточным ПО.

13 голосов
/ 05 января 2010

Чтобы вызвать код C ++ из Ruby, вы, вероятно, захотите создать расширение.

Если вы опытный разработчик C ++, вы можете чувствовать себя комфортно с Райсом:

https://github.com/jasonroelofs/rice

Для упрощения написания расширений используются методы метапрограммирования C ++.

Если вы звоните в C, вы также можете использовать ffi. Вызов кода на C ++ немного сложнее, чем вызов кода на C из-за искажения имен и исключений.

5 голосов
/ 09 октября 2009

Я полагаю, что спрашивающий спрашивает, как вызвать C ++ из с помощью Ruby, если это так, то для простого C / C ++ RubyInline 1 является безусловно самым простым решением.

В качестве альтернативы, если вам нужно вызывать более субстанциональный код C ++, вы можете создать расширение ruby. Вот хороший учебник

2 голосов
/ 09 октября 2009

Вам нужно обернуть свой код C ++ в интерфейс C, а затем связать эти функции C с методами ruby, используя rb_define_method ()

В качестве альтернативы вы можете использовать SWIG, как сказал Аурелиен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...