Bibliotheken
-
Moin!
Also ich hab folgendes Problem:
Ich möchte ein Programm erstellen mit einer Datenbankanbindung. Ich wollte da SQLite benutzen, weil man dann keinen zusätzlichen Datenbankserver installieren muss.
Aber jetzt hab ich keine Ahnung wie man die sqlite3.so benutzt. Ein Freund hat mir erzählt das man bei DLL's die Adressen der Funktionen erst suchen muss. Muss ich das hier auch machen oder wie läuft das.
Hab schon gegoogelt aber nix brauchbares gefunden.
Ich muss einfach nur wissen wie man die lib benutzt.
Also das is keine Static sondern eine Shared-Lib, wenn das wichtig ist.thx im voraus
blaxx
-
eigentlich ist es ganz einfach, denn erst beim Linken muss die Bibliothek vorhanden sein.
Ich kenne SQLite nicht, hab damit nie gearbeitet. Aber ich denke, dass es eine Header Datei haben muss (#include <sqlite.h> vielleicht?), in der die Funktionen von SQLite definiert sind, so dass der Compiler sie auch kennt.
Beim Linken muss man die Option -llib name eingeben. Die Libs muessen so heissen: libirgendwas.so. Beim Linken muss man so machen: gcc ... -lirgendwas
-
achsoo... ja ich werd das mal probieren.
die Headerdatei hab ich wohl.
Muss die Lib in einem bestimmten Ordner liegen oder kann die auch zusammen mit dem quellcode in einem Ordner liegen?Wird die .so bei der Laufzeit benötigt??
blaxx
-
Die .so Datein muessen in bestimmten Ordner sein (sieh /etc/ld.so.conf) und wird teilweise auch vond er Variable LD_LIBPATH gesetzt. Meistens befinden sich die Libs unter /lib und /usr/lib. Die Bibliotheken muessen diese Namenkonvension erfuellen: liblinbame.so und beim Linken immer -llibname. Wenn die .so Datei sich irgendwo anders befindet, wo es keine Bibliotheken gibt, muss man zustaetzlich mit -Lpfad der bibliothek kompilieren und beim Ausfuehren muss diesen Pfad zum LD_LIBPATH hinzugefuegt werden.
Wenn du dynamisch linkt (wie ich es sagte) muss die .so Datei vorhanden sein, wenn man das Programm ausfuehrt.
-
also ich hab da nochmal ne frage...
wie kann ich dem linker sagen, dass das programm nicht den libpaths nach der lib sucht sondern in dem stammordner des programms und dann z.b. im ordner lib.
was muss ich da beim kompilieren mit angeben?
-
@blaxx
hat supertux doch angegeben
-
ja schon aber wenn ich das nicht in LD_LIBPATH speichern will... gibts da keine andere lösung?
-
statisch linken
-
ja und wie mach ich dass...
hab keine ahnung fang grad erst an unter linux zu proggen
-
Naja, du brauchst eben die statische Variante der library (endet mit .a). (Kann man ganz leicht mittels man: ar(1) aus Objektdateien erstellen). Dann gibst du noch das Flag -static an oder falls du nicht alle libraries statisch linken willst, kannst du auch den direkten Pfad zur library angeben (anstelle über -l<foo> zu linken).
-
ich glaube ich hab eine bessere lösung gefunden...
also die lib liegt jetzt in lib/
so und dann kompilier ich mit:g++ -o db src/main.cpp -l sqlite3 -L ./lib -Xlinker -rpath ./lib
durch -L findet der linker die lib beim linken und mit -Xlinker gebe ich weitere anweisungen an die linker... -rpath ist der pfad wo das programm beim starten nach den libs suchen soll... in diesem fall aus in dem unterordner lib des ordner wo die executable drin ist.
funzt auch...trotzdem danke an euch...
bis dann
blaxx