in C-Library C++ verwenden???



  • Hallo,

    ich arbeite mit Modelica als objektorientierte Simulationsumgebung. Es ist möglich dort externen C-Code zu integrieren. Dazu muss einen Headerdatei und eine Library mit der Endung ".a" eingebunden werden.

    Ich habe einige praktische Bibliotheken, die ich gerne einbinden würde, die allerdings in C++ geschrieben sind. Das Einbinden funktioniert nicht ohne weiteres. Der gcc-Compiler kann mit den lib-Dateien nichts anfangen.

    Wie kann man es hinbekommen, eine C-Library zu erstellen, die auf eine C++-Library zugreift, ohne dass Modelica den C++-Code mit compilieren muss???

    Danke.



  • KeineAhnung78 schrieb:

    Wie kann man es hinbekommen, eine C-Library zu erstellen, die auf eine C++-Library zugreift, ohne dass Modelica den C++-Code mit compilieren muss???

    Du kannst unter C nur bestimmte "normale" Funktionen (keine Memberfunktionen) aus C++ aufrufen, das aber auch nur wenn du die entsprechenden Funktionen als extern "C" deklarierst (in der C++ Bibliothek). Falls das aber keine selbergeschriebene ist oder falls die Objekte oder exceptions verwendet, dann lass es am besten bleiben oder nimm einfach nen c++ compiler für dein Projekt.



  • Falls das aber keine selbergeschriebene ist oder falls die Objekte oder exceptions verwendet, dann lass es am besten bleiben oder nimm einfach nen c++ compiler für dein Projekt.

    Ich such mir die Compilieroptionen ja leider nicht selber aus. Das macht Modelica (www.modelica.org).

    OK, die Geschichte mir dem extern "C" war mir bekannt...

    Aber so wie es aussieht, scheint das nicht so zu klappen, wie ich das brauche, denn ich würde gerne von Modelica aus auf meine C++-Klassen zugreifen.



  • Hi, du musst dir halt ein C Interface für deine C++ Klassen machen, und dann halt mit einem Handle arbeiten.

    Beispiel mehr oder weniger Pseudocode:

    C++ Klasse:

    class Foobar
    {
    public: 
         Foobar(); 
         ~Foobar();
         bool MyFunction(int parameter);
    };
    

    C Interface:

    extern "C" 
    {
        struct FoobarHandle;
        typedef struct FoobarHandle f_handle;
        f_handle * create_foobar();
        int foobar_MyFunction(f_handle * h, int parameter);
        void free_foobar(f_handle * h);
    }
    

    Implementation des Interface:

    #include "foobar.h"
    struct FoobarHandle
    {
        Foobar * ptr;
    };
    
    extern "C" 
    {
        f_handle * create_foobar()
        {
             f_handle * f_handle = new f_handle();
             f_handle->ptr = new Foobar();
        }
        int foobar_MyFunction(f_handle * h, int parameter)
        {
             if(h && h->ptr) return h->ptr->MyFunction(parameter);
             return 0; // Fehler
        }
        void free_foobar(f_handle * h)
        {
            if(h) delete h->ptr;
            delete h;
        }
    }
    


  • OK, danke. Werd ich mir mal auf der Zunge zergehen lassen und ausprobieren 🙂 !



  • evilissimo schrieb:

    f_handle * create_foobar()
        {
             f_handle * f_handle = new f_handle();
             f_handle->ptr = new Foobar();
        }
    

    Also hier dürfte noch ein return fehlen (und ich bezweifle, daß ein Compiler die Deklaration "f_handle* f_handle;" schlucken würde).



  • CStoll schrieb:

    evilissimo schrieb:

    f_handle * create_foobar()
        {
             f_handle * f_handle = new f_handle();
             f_handle->ptr = new Foobar();
        }
    

    Also hier dürfte noch ein return fehlen (und ich bezweifle, daß ein Compiler die Deklaration "f_handle* f_handle;" schlucken würde).

    Ich hab ja drüber geschrieben "Beispiel mehr oder weniger Pseudocode:"

    Ich hatte das nur auf die schnelle hingeschrieben 😉 Ich wollte damit keine 100% korrekte Lösung aufzeigen, sondern nur zeigen wie es ungefähr gehen könnte.

    BR
    Vinzenz


Anmelden zum Antworten