Come posso chiamare le funzioni C ++ dall’interno di Ruby

Sono uno sviluppatore esperto di C / C ++ ma sono un novizio in Ruby.

Come posso chiamare una funzione C ++ da con in Ruby?

Hai 3 possibilità:

1) Ruby è in grado di caricare le librerie. Anche se è un po ‘complicato, puoi decidere di scrivere il tuo caricatore e colbind la tua libreria C ++ in Ruby. Questo viene fatto usando quello che viene chiamato un modulo di estensione . Troverete un tutorial completo qui: http://www.rubyinside.com/how-to-create-a-ruby-extension-in-c-in-under-5-minutes-100.html

2) Puoi usare uno strumento che genererà il wrapper Ruby attorno alla tua libreria C ++. Guarda SWIG ad esempio ( http://www.swig.org/ ). Devi solo creare un file in una syntax specifica di swig e fornirlo a SWIG. Sarà quindi in grado di generare il wrapper per molte lingue, incluso Ruby.

3) È ansible scegliere di utilizzare un middleware , come CORBA / ICE / qualunque. Potrebbe essere un po ‘eccessivo se si desidera chiamare solo alcune funzioni del C ++, ma ti permetterà di chiamare a distanza le funzioni o “hide” una griglia dietro il middleware.

Per chiamare il codice C ++ da Ruby, probabilmente vorrai creare un’estensione.

Se sei uno sviluppatore C ++ esperto, potresti sentirti a tuo agio con Rice:

https://github.com/jasonroelofs/rice

Utilizza tecniche di metaprogrammazione C ++ per semplificare la scrittura delle estensioni.

Se stavi chiamando in C, potresti anche usare ffi. Chiamare codice C ++ è un po ‘più complicato di chiamare il codice C a causa del nome mangling e delle eccezioni.

Credo che l’interrogante stia chiedendo come chiamare C ++ da in Ruby, in tal caso il semplice C / C ++ RubyInline 1 è la soluzione più semplice.

In alternativa, se è necessario chiamare più codice C ++ substatntial, è ansible creare un’estensione ruby. Ecco un buon tutorial

È necessario avvolgere il codice c ++ in un’interfaccia C e quindi associare le funzioni C ai metodi ruby ​​usando rb_define_method ()

in alternativa puoi usare SWIG, come ha detto Aurelien.