erstellen von shared library- Wie binde ich da externe Biliotheken ein?



  • Hi, ich versuche eine Anwendung als shared library zu kompilieren, damit sie später von einem Apache mod verwendet werden kann. Der Apache mod(mod_gsoap) stammt nicht von mir, sondern von Sourceforge und eigentlich soll das auch alles funktionieren. Eigentlich.
    Ich versuche meine Datei zu kompilieren, dazu ist innerhalb der Datei ein Header eigebunden, namens apache_gsoap.h. Dieser Header entstammt dem mod_gsoap Paket und muss eingebunden werden, damit der Kram nachher zusammen mit der Apache modul funktioniert. So weit alles kein Problem. ich kompiliere also:

    g++ -fPIC -DPIC -c apamod.cpp -lcurl -lmysqlclient `pkg-config --libs --cflags libxml++-2.6` `pkg-config --libs --cflags glibmm-2.4` -I/usr/include/apache2 -I/usr/include/apr-0/
    

    und wie es immer so ist, gibt es Fehler:

    In file included from apamod.cpp:42:
    apache_gsoap.h:24: error: Syntaxfehler before `void'
    apache_gsoap.h:30: error: Syntaxfehler before `int'
    (...und Folgefehler...)
    

    An den betreffenden Stellen im Header stehen typedefs, wie z.B. in der ersten mokierten Zeile:

    /*
         * calls soap_serve inside shared library 
         */
        typedef SOAP_FMAC1 void (SOAP_FMAC2 * apache_soap_init_fn) (struct soap *,  request_rec *);
    

    Nun sehen die gar nicht verkehrt aus und da dieser Header offenbar in anderen Projekten tadellos "funktioniert" stehe ich da wie der Ochs vorm Tore und baruche irgendeinen Hinweis darauf, was den da wirklich verkehrt läuft und wo denn die Fehler zu suchen sind. Vielen Dank für jeden Tipp!

    EDIT: Ich Trottel habe zwei Header in der falschen Reihenfolge eingebunden....nu ist alles (fast) okay.



  • Das nächste Problem folgat auf den Fuss. Die shared library liess sich nun wunderbar kompilieren, nur leider ignoriert der Kompiler die Behandlung von Geschichten wie -lcurl etc. Nur sind diese Bibliotheken nunmal notwendig, damit die Funktionen in der shared lib überhaupt einen Sinn haben, wie verbinde ich das jetzt miteinenader?



  • -c hat da ja auch nichts zu suchen, da es das linken auslässt und wenn du nicht linkst, kann der Linker auch keine Libraries einbinden und am Ende hast du auch keine Shared-Lirbary

    g++ -fPIC -DPIC -shared foo.cpp

    FAQ



  • In den FAQ wird das Linken im Speziellen gar nicht behandelt, da ist eben in jedem Beispiel das -c zu sehen. Wenn ich es mache, wie Du vorschlägst (also mit -shared an Stelle von -c), erhalte ich als Ergebnis eine Binärdatei Namens a.out, mit der ich aber nichts anzufangen weiss und nicht die gewünschte *.o Datei.

    Den Schritt mit g++ -shared führe ich normalerweise erst aus, nachdem ich mittels g++ -fPIC(..) die gewünschten *.o Dateien erstellt habe, um so die *.so File zu erzeugen.



  • Ich denke, dass du vielleicht noch einige Probleme hast den Compile Prozess nach zu vollziehen:

    Ein Objekt-Datei ist das was der Linker am Ende schluckt und daraus ein Binary formt. Wenn du nun -c beim GCC angibst, dann linkt der GCC nicht, sondern erzeugt nur die Objekt-Datei. Also findet auch kein Linken statt und du kannst keine Libraries linken, wie der GCC dir eigentlich mitteilen sollte.

    Wenn du nun die Shared Library aus den Objekt Dateien erzeugst, dann linkst du die Objektdateien zusammen. An dem Punkt gibst du die Libraries an, die du mitlinken willst.

    kompilieren und Objektdatei erzeugen:

    > gcc -fPIC -DPIC foo.c
    

    Linken:

    > gcc -shared -lmoep foo.o -o libfoo.so
    


  • Ahhhh...jetzt beginne ich zu begreifen. Dass kommt eben dabei herum, wenn man an Visual Studio ausgebildet wird und dann ins kalte Wasser der Unix Programmierung geschmissen wird.


Anmelden zum Antworten