Ich habe SQLIte3-Datenbank-Engine von sqlite3.c mit BCC 55 mit dem folgenden Befehl kompiliert:
%Vor%Die richtige Datei sqlite3.obj wurde generiert. Aber sobald ich versuche, es in meiner Delphi-Anwendung wie folgt zu verknüpfen:
%Vor%Ich bekomme folgende Fehler:
%Vor%Warum werden die Borland C ++ Laufzeitfunktionen in reinem Pascal (oder Asm) benötigt? Können die im Obj nicht direkt verlinkt werden? Einige von ihnen sind bereits in System.pas implementiert, aber der Compiler beschwert sich?
Der Grund für die Ausführung dieses mysqlf anstelle von SynSQLite3 oder DIXml lautet wie folgt:
SynSQLite3 unterstützt 3.7.8 (ich sehe nicht die neuesten 3.7.9)
SynSQLite3 vermisst einige Deklarationen wie sqlite3_trace, sqlite_open_v2, etc.
SynSQLite2 ist etwa 18-mal langsamer als DIXml 2.4.0 in konsequenten 20 000 Schritten
DISQLite3 ist bezahlt
DISQLite 2.4.0 ist schnell 20000 Schrittoperationen in 260ms, unterstützt aber nicht DXE2
DISQLite 3.0.0 und 3.1.0 unterstützen DXE2, sind aber etwa 8 mal langsamer als 2.4.0
Ich bin ein sehr neugieriger Typ und versuche immer so nah wie möglich am Metall zu arbeiten.
Ein großes Lob an die Entwickler von SynSQLite3 und DISQLite3 - wirklich gute Arbeit bisher.
Schließlich entschied ich mich schließlich für SynSQLite3, weil :
Es ist Open Source
Es ist sehr gut dokumentiert
Ich habe gelernt, sqlite3.obj selbst neu zu kompilieren und nur die benötigten Kompilierungsschalter für die Funktionen zu lassen, die ich brauche
Ich kann die aktualisierte Version 3.7.9 mit
Mit dem feinjustierten letzten 3.7.9 obj habe ich die Geschwindigkeit von DISQLite3 erreicht
Der Typ von DISQLite3 hat nicht einmal eine E-Mail-Adresse auf seiner Website, an die er schreiben kann (nur eine Mailing-Liste), wo die Jungs von SynSQLite3 zur selben Stunde in SO antworten. Dies ist sinnvoll, wenn Sie eine Lib vor einer anderen auswählen. Leistung und Preis sind nicht alles.
P.S. Mein sqlite3.obj ist temporär zum Download verfügbar und testet hier
Sehen Sie sich unsere Open-Source-Bibliotheken an. Es implementiert die statische Verknüpfung von sqlite3.obj und wird mit der neuesten Version des offiziellen SQLite3-Codes (und Funktionen - es ist das einzige Framework, das eine erweiterte Nutzung der SQLite3 Virtual Tables zum Beispiel erlaubt) beibehalten. Du hast einen Wrapper. Aber mehr als das.
So kompilieren wir die Quelle in die .obj (eins ohne FTS3, das andere ohne es):
%Vor%Dann werfen Sie einen Blick auf die SynSQLite3.pas -Einheit. Es enthält einige pascal oder asm Versionen der benötigten externen Dateien.
Zum Beispiel:
%Vor%Sie finden in dieser Einheit viel mehr als nur eine statische Verknüpfung von SQLite3. Beachten Sie, dass dieses ORM, auch wenn es von unserem mORMot ORM Client-Server-Framework verwendet wird, nicht ist, um die SQLite3-Klassen zu verwenden. Weitere Informationen finden Sie in diesem Artikel .
Wenn Sie in unserem Quellcode-Repository (mit dem großen FOSSIL-Projekt) verloren gehen, lesen Sie dies .
Update : Sie werden mit SynSQLite3.pas
, wie von Arnaud vorgeschlagen, viel besser dran sein. Allerdings hinterlasse ich diese Antwort hier, da sie einige der Tricks veranschaulicht, die verwendet werden können, um fehlende Abhängigkeiten beim statischen Linken aufzulösen.
Was hier passiert, ist, dass die .obj-Datei von verschiedenen C-Laufzeitfunktionen abhängt, die von Ihnen bereitgestellt werden müssen.
Als Erstes fügen Sie crtl
zur uses
-Klausel der Einheit hinzu, die die $LINK
-Direktive enthält. Die crtl
-Einheit enthält Implementierungen einiger C-Laufzeitbibliotheksfunktionen und ist nur für diesen Zweck konzipiert.
Wenn Sie dies tun, werden einige fehlende Abhängigkeiten aufgelöst, und es werden viele weitere angezeigt.
%Vor% Viele dieser Funktionen sind einfach Windows-API-Funktionen und können einfach durch Hinzufügen von Windows
zu Ihrer uses-Klausel gelöst werden.
An dieser Stelle bleibt folgendes übrig:
%Vor%Um diese zu beheben, müssen Sie entweder:
$LINK
enthält. Ich bin nicht wirklich sicher, was diese Funktionen tun, damit Sie etwas mehr Arbeit vor sich haben. Meine Vermutung ist, dass diese Funktionen 64-Bit-Integer-Arithmetikroutinen sind. Sie können dies möglicherweise rückentwickeln, indem Sie kurze Bits von C schreiben, um verschiedene 64-Bit-Rechenoperationen durchzuführen. Kompiliere dann mit bcc32 und betrachte die Ausgabe als asm
. Vermutlich bcc32
kann asm
ausgeben. Oder Sie könnten einfach eine Verbindung zu einer Delphi-Einheit herstellen und sehen, welche der obigen Funktionen den Operationen entspricht, die Sie in Ihrem C-Code verwendet haben.
Sie könnten localtime
aus msvcrt.dll
ziehen, immer eine nützliche Option für fehlende C-Laufzeitfunktionen. Genau so verhält es sich mit der aktuellen Implementierung der Unit crtl
. Wenn Sie also crtl
verwenden, können Sie auch localtime
auf die gleiche Weise erhalten.
Wenn Sie etwas Code von Arnaud ausleihen, kompiliert die folgende Einheit erfolgreich:
%Vor%Beachten Sie, dass Sie für diese Funktionen keine Parameterliste, Aufrufkonvention usw. angeben müssen, da wir sie hier nicht implementieren. In jedem Fall delegiert der Code einfach die Implementierung.
Allerdings fehlt immer noch der Code, um die Funktionen von sqlite3 zu deklarieren. Außerdem habe ich noch nicht einmal versucht zu testen, ob es funktioniert oder nicht. Eine erfolgreiche Kompilierung ist nur der erste Schritt.
Ich empfehle dringend, dass Sie den Code verwenden, auf den Arnaud Sie hinweist, wenn Sie statische Verknüpfungen verwenden möchten. Dieser Code hat eindeutig viel Nutzen und Tests gehabt und Sie können davon ebenso profitieren.
Die statische Verlinkung erleichtert die Bereitstellung, die dynamische Verknüpfung mit einer DLL ist jedoch wesentlich einfacher.