Подтвердить что ты не робот

Как я могу вызвать функции С++ изнутри ruby

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

Как я могу вызвать функцию С++ с помощью в Ruby?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Чтобы вызвать код С++ из Ruby, вам, скорее всего, захочется построить расширение.

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

https://github.com/jasonroelofs/rice

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

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

Ответ 3

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

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

Ответ 4

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

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