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.oBevor 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 -lhelloMö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.cppar -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