[ruby-de] Einbindung von C++-Biblothek

Marvin Gülker m-guelker at phoenixmail.de
Fr Sep 8 21:11:32 JST 2017


Am 08. September 2017 um 11:04 Uhr +0200 schrieb topofocus <topofocus at gmail.com>:
> Auch nachdem ich diverse "Manuals" studiert hab, steh ich ziemlich auf dem
> Schlauch.
> Was ich bisher gemacht habe:
> 
>  * Ein Gem angelegt
>  * Den c++-Code aus dem offiziellen git dort hinein kopiert

Den C++-Code der Zielbibliothek solltest du nicht kopieren müssen. Du
linkst vielmehr gegen die Bibliothek.

> Hat jemand Erfahrung mit der Einbindung von C++-Bilotheken und kann mich bei
> den nächsten Schritten an die Hand nehmen?

Ich habe das mal vor langer Zeit gemacht. Ruby ist ziemlich egal, an
welche Sprache du anbindest, solange es einen Einsprungpunkt mit
C-Name-Mangling ansteuern kann. Das heißt, du hältst dich im
Wesentlichen an die offizielle Dokumentation für Ruby-C-Extensions in
den Ruby-Quellen¹ und nutzt C++ nur innerhalb der für rb_define_method()
vorgesehenen Funktionen. Ungetestetes Minimalbeispiel:

    // myextension.cpp
    static VALUE ruby_foo()
    {
      //
      std::cout << "Using C++" << std::endl;
    }

    extern "C" {
    void Init_myextension()
    {
      rb_define_method(rb_cObject, "foo", ruby_foo, 0);
    }

    } // extern "C"

Es ist ohne weiteres möglich, Instanzen von C++-Klassen in ein
Ruby-VALUE zu verpacken, solange du sie mit „new“ allozierst. Das
Wrapping funktioniert genauso wie mit herkömmlichen C-Pointern.

Solltest du bisher keine C-Extensions geschrieben haben, solltest du
dich erstmal an einer „reinen“ C-Extension versuchen. Sobald du das
Konzept verstanden hast, kannst du den Schritt hinüber zu C++ machen.

Marvin

¹ https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v2_4_1/doc/extension.rdoc?view=markup

-- 
ruby-de-Admin

Blog: https://www.guelkerdev.de
PGP/GPG ID: F1D8799FBCC8BC4F


Mehr Informationen über die Mailingliste ruby-de