Uwe_9988 hat geschrieben:Hallo zusammen,
ich passe gerade einige SQLite3-Units an (Wrapper und ein paar nützliche Klassen), die ich unter Delphi verwendet habe und die ich um Funktionen erweitert habe, die ein linken der sqlite3.dll als Resource ermöglichen. Zur Laufzeit werden die Funktionen der dll dann direkt im Speicher ausgeführt.
Man kann also die Funktionen der dll verwenden ohne die dll im Programmverzeichnis entpacken oder überhaupt mitgeben zu müssen. Außerdem muss man sich nicht um dll-Versionen kümmern, weil automatisch die richtige dll verwendet wird.
Unter Windows funktioniert das schon für Win32 sowohl mit Delphi als auch mit Lazarus.
Meine Frage ist jetzt, ob es sinnvoll/möglich ist das ganze auch an Linux anzupassen oder ob sich diese Problematik unter Linux gar nicht so stellt. (Dass es sqlite3 schon für Lazarus gibt, ist mir bewusst. Es geht eher um den Gedanken eine dynamische Library statisch an ein Programm zu binden.

)
Grüße,
Uwe
Hallo Uwe,
ich bin mir bewusst, dass der Thread schon uralt ist und du vielleicht schon nicht mehr mitliest, jedoch ist die (deine) Frage nach wie vor aktuell (zumindest für mich

).
Ich sehe diesen Aspekt genauso wie Du (alle Dateien mitliefern wollen) und interessiere mich daher auch für die Frage, ob ich unter Linux die Lib (genauer sqlite3.so oder libsqlite3.so) irgendwie in dem Programmverzeichnis (das finale Anwenderverzeichnis) kopieren kann. Ich möchte garnicht so weit gehen und die unbedingt zusammenlinken wollen (was natürlich seinen Charme hätte).
Das funktioniert durch einfaches Kopieren jedenfalls schon mal bei mir nicht so einfach, wie zu erwarten war.
Lazarus (bzw. Linux) scheint nicht automatisch im aktuellen Programmpfad die Library zu suchen....
Habe aus /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 (der symbolische Link @libsqlite3.so zeigt darauf) in mein finales Programmverzeichnis kopiert. Auf dem Ziel-PC ist keine SQLite3 Version installiert, es ist dort auch keine Lib vorhanden (gut zum Testen).
Wenn ich das Programm starte und die DB öffnen will erscheint:
Code: Alles auswählen
Can not load SQLite client library "libsqlite3.so". Check your installation.
Press OK to ignore and risk data corruption.
Press Abort to kill the program.
Die Dateirechte der sqlite3.so sind: 775, Owner ist der Benutzer, nicht Root.
In meinem kleinen Testprogrämmchen habe ich auch nirgends den Libpfad angeben müssen, das machen scheinbar die Komponenten (SQLite3Connection, SQLTransaction, SQLQuery) automatisch und so findet Lazarus auf meinen Entwickler-PC (hier natürlich SQLite3 installiert) die Library.
Ich verbinde im Testprogramm lediglich die Komponenten untereinander und gebe die DB unter SQLite3Connection.Database an und öffne diese mit SQLite3Connection.open.
Fertig, löppt sofort auf dem Entwickler-PC.
Jetzt wäre prima, wenn ich auf dem Ziel-PC (ebenfalls Linux mit Kubuntu 18.04, genauer der Virtualbox-Host, entwickelt wird in einem Gast mit selben OS) das Programm starten könnte, ohne dass dort explizit SQLite3 installieren muss.
Ich bin mir bewusst, dass dieses Vorgehen nicht der Philosophie vieler Entwickler entspricht, doch für mich ist es übersichtlicher und einfacher zu handeln und es gibt so keine Konfikte mit anderen Programmen etc.
Viele lieb gewonnene Tools sind mir da Vorbild, wo ich lediglich das Programmverzeichnis irgendwohin kopieren kann und es sofort funktioniert... ohne irgendwelche Installation.
Kann mir wer auf die Sprünge helfen und Tipps geben?
Viele Grüße,
Ralf