Dynamische Librarys (*.so) erstellen



  • Hi,
    Ich hab ein Java - Programm geschrieben welches auf native Code zugreift. Diesen native Code hab ich bisher in einem DLL - Project ( Windows ) realisiert. Nun soll mein Java Programm auch auf Linux laufen. Meine Frage also : Wie mache ich aus meinen .cpp & .h Files eine Bibliothek ( .so glaub ich ). Es kann ruhig etwas ausführlicher beschrieben sein, denn ich betrete gerade absolutes Neuland.

    Ferner , binde ich in einem .cpp File die Datei jni.h ( native Interface ) , die im Javaverzeichnis jdk1.3.1/bin/include zu finden ist, ein.
    Wie mache ich das der Compiler ( gcc ) diese Datei kennt ?

    Für jeden Tip meinen Dank im Voraus
    Shack images/smiles/icon_confused.gif

    [edit]Titel verändert, so dass man in der FAQ schneller den Beitrag findet (Original:

    Bibliothek erstellen + gcc

    [/edit]

    [ Dieser Beitrag wurde am 08.03.2002 um 20:58 Uhr von kingruedi editiert. ]



  • g++ -c file1.cpp file2.cpp

    ar -r libname.a file1.o file2.o



  • Beispiel:
    Du möchtest aus eine Shared-Library (Dateiendung *.so) erstellen. Hierzu hast du den Quellcode in hello.h und hello.c bereits wie folgt vorliegen:

    #include <stdio.h>
    
    void hellow(void)
    {
      printf("Hello World ");
    }
    

    hello.c

    void hellow(void);
    

    hello.h

    Im Programm benutzt du dann den hello.h Header und du kannst die Funktion hellow() aufrufen:

    #include "hello.h"
    
    int main(int argc, char** argv)
    {
      hellow();  // aus unserer lib
      return 0;
    }
    

    main.c

    Unter Linux erstellst du mit
    $ gcc -fPIC -DPIC -c hello.c
    $ gcc -shared -o libhello.so.1.0 -Wl,-soname,libhello.so.1 hello.o
    $ ln -s libhello.so.1.0 libhello.so.1
    $ ln -s libhello.so.1 libhello.so
    eine Shared Library.

    Unter Sun Solaris geht das mit
    $ gcc -fPIC -DPIC -c hello.c
    $ ld -G -o libhello.so hello.o

    Bevor du die Lib benutzen kannst, musst du den Pfad wo die Lib zu finden ist (hier: ./ )in der Variablen LD_LIBRARY_PATH eintragen:
    $ export LD_LIBRARY_PATH=.:${LD_LIBRARY_PATH}

    Beim Compilieren musst du mit "-lhello" die Bibliothek "libhello" dazu linken:
    $ gcc -L. -o main_binary main.c -lhello

    Möchtest du eher eine statische Bibliothek (Dateiendung *.a) erstellen dann
    $ gcc -fPIC -DPIC -c hello.c
    $ ar rcs libhello-static.a hello.o
    ausführen und mit
    $ gcc -L. -o main_binary main.c -lhello-static
    die Bibliothek "libhello-static" mit Hilfe von "-lhello-static" zu deinem Binary "main_binary" statisch hinzubinden. Die Anmerkungen zu LD_LIBRARY_PATH gelten beim Kompilieren genauso wie bei einer Shared-Library. Allerdings wird die Bibliothek (da statisch zum Programm hinzu gebunden) zur späteren Programmausführung nicht mehr benötigt -- dafür ist aber auch das Binary deines Programms etwas grösser als bei Verwendung einer Shared-Library.



  • Original erstellt von Doktor Prokt:
    **g++ -c file1.cpp file2.cpp

    ar -r libname.a file1.o file2.o**

    Auf manchen Plattformen scheint es möglich zu sein, funktionierende shared libraries auch ohne die Compiler-Option "-fPIC" zu erzeugen. Mindestens auf der ARM Plattform funktioniert ein solches vorgehen allerdings anscheinend nicht.

    Da aber die Program-Library-HOWTO schreibt, dass man zum erzeugen einer shared library den Library Quellcode mit "gcc -fPIC -c hello.c" kompilieren und mit "gcc -shared -o libhello.so main.o" linken soll, denke ich einfach mal dass dies die korrektere Vorgehensweise ist.

    How to build libraries ? http://lists.samba.org/pipermail/linux/1997-November/000318.html

    [ARM] about shared libraries http://lists.arm.linux.org.uk/pipermail/linux-arm/2000-November/000221.html

    Program-Library-HOWTO http://www.linuxdoc.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN79



  • Hier ein script

    #!/bin/bash
    
    echo "Gib den Programmnamen ein"
    read programm
    echo "S fuer Sharedlib,O fuer Object,A fuer Archive" 
    read status
    
    if [ "$programm" = "" ];
    then
    echo "Kein Programmname eingegeben";
    exit 1
    fi
    
    g++ -fPIC -DPIC -c $programm.cpp
    
    if [ "$status" = "O" ];
    then
    exit 1
    fi
    
    if [ "$status" = "S" ];
    then
    g++ -shared -o lib$programm.so.1.0 -W-soname $programm.o
    ln -s lib$programm.so.1.0 lib$programm.so
    else
    ar rcs lib$programm-static.a $programm.o
    fi
    

    in ein file kopieren und das recht ausführen geben


Anmelden zum Antworten