Anzeige:
Ergebnis 1 bis 7 von 7

Thema: C++ und Shared Lib

  1. #1
    Registrierter Benutzer
    Registriert seit
    04.02.2003
    Beiträge
    33

    C++ und Shared Lib

    Hi,

    ich versuche mich gerade in der Library-Erstellung, was mit C anscheinend kein Problem ist. Allerdings habe ich grosse Probleme, in C++ auf Klassen zuzugreifen, die in den .so-Dateien implementiert sind. Quasi geht es überhaupt nicht (:.

    Ich denke, es fehlt einfach eine Vorwärtsdeklaration ... aber ich kann ja nicht die Prototypen der Klasse einbauen. Nehmen wir mal meine folgende (Meister-) Klasse:

    Code:
    #include <iostream>
    
    class meineKlasse {
    
            public:
                    meineKlasse();
                    ~meineKlasse();
                    void printHello();
    
    };
    Die die folgende Implementation besitzt:

    Code:
    #include "meineklasse.h"
    
    meineKlasse::meineKlasse() {
    }
    
    meineKlasse::~meineKlasse() {
    }
    
    void meineKlasse::printHello() {
            printf("Hello World");
    }
    Alles soweit recht einfach und plain. Mit folgenden Befehlen kompiliere ich die zu einer Shared Library:

    c++ -fPIC -c meineklasse.cpp
    c++ -shared -Wl,-soname,libmeineklasse.so.0 -o libmeineklasse.so.0.0 meineklasse.o-lc

    Das funktioniert auch ganz ohne Fehlermeldung.

    Wenn ich jetzt aber damit in meiner main.cpp arbeiten möchte:

    Code:
    class meineKlasse;
    
    int main() {
    
            meineKlasse mk;
    
            return 0;
    
    }
    und das so kompiliere:

    c++ main.cpp -lmeineklasse

    kommt der folgende Fehler:

    main.cpp: In function `int main()':
    main.cpp:5: error: aggregate `meineKlasse mk' has incomplete type and cannot be
    defined
    Die Shared Lib liegt unter /usr/local/lib und ldconfig habe ich danach auch ausgeführt, ohne das er meckerte.

    Vllt. weiss hier noch jemand, was falsch laufen könnte (ist bestimmt nur eine Kleinigkeit) ... im Internet finde ich nur, wie ich C-Shared-Libs unter C++ nutze ...

    Vielen Dank,

    Morfio ...

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Du musst die Klassendefinition (das ist das "class XXX { ... };") in jeder Übersetzungseinheit einbinden (typischerweise per #include) in der du die Klasse verwendest. Nur in Ausnahmefällen reicht die Vorwärtsdefinition aus.

    Vielleicht ist es das Beste, wenn du auch ein C++-Buch oder -Tuturial konsultierst.

  3. #3
    Registrierter Benutzer
    Registriert seit
    04.07.1999
    Ort
    Zürich
    Beiträge
    221
    Das [1] C++-dlopen-mini-Howto ist ein guter Einstieg.

    MfG
    f0rtex

    [1] http://www.isotton.com/howtos/C++-dl...ini-HOWTO.html
    Doctrína est fructus dulcis radícis amárae.

  4. #4
    Registrierter Benutzer
    Registriert seit
    04.02.2003
    Beiträge
    33
    @locus vivendi

    Vielleicht ist es das Beste, wenn du auch ein C++-Buch oder -Tuturial konsultierst.
    Das ist ja das Dumme. Ich habe hier etliche Bücher (C++), in denen das lustigerweise nur für C steht. Und im Internet habe ich überhaupt nichts dazu gefunden, sonst hätte ich ja nicht gefragt.


    @f0rtex

    Das [1] C++-dlopen-mini-Howto ist ein guter Einstieg.
    Vielen Dank, das sieht schonmal sehr sehr gut aus. Werde ich nachher mal durchlesen.

    Morfio ...

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Hier gibt es keine Unterschiede zu C: Auch in C musst du die Prototypen deklarieren, was üblicherweise durch das Einbinden von Header-Dateien geschieht, aber nicht unbedingt so erfolgen muss. Eine Klassendeklaration ist nichts anderes. Schliesslich musst du auch structs in C so angeben.
    Beispiel gefällig? (nur Schematisch):
    Code:
    header.h:
    class Foo {
        public: int doSomething();
    }
    
    library.c:
    #include "header.h"
    int Foo::doSomething() { return 42; }
    
    main.c:
    #include "header.h"
    int main() {
        Foo f;
        f.doSomething();
        return 0;
    }
    
    $ gcc -shared -o library.so library.c
    $ gcc -lrary -o program main.c
    Sei noch zu erwähnen, dass die Bindings von C++ anders als in C sind. Wenn aus C++ heraus Funktionen in C-Bibliotheken aufgerufen werden, müssen diese daher als "extern C" deklariert werden.

  6. #6
    Registrierter Benutzer
    Registriert seit
    04.02.2003
    Beiträge
    33
    Ach, ok, jetzt habe ich verstanden, was Du meinst. Vielen Dank ...!

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von f0rtex
    Das [1] C++-dlopen-mini-Howto ist ein guter Einstieg.
    Für den Fall das er mal später dlopen benutzen will

    Das Problem war ja bereits ein Compilerfehler (vergessenes include)

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •