Das Verknüpfen von sqlite3.obj führt zu unbefriedigenden Vorwärtsdeklarationsfehlern

8

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 :

  1. Es ist Open Source

  2. Es ist sehr gut dokumentiert

  3. Ich habe gelernt, sqlite3.obj selbst neu zu kompilieren und nur die benötigten Kompilierungsschalter für die Funktionen zu lassen, die ich brauche

  4. Ich kann die aktualisierte Version 3.7.9 mit

  5. verknüpfen lassen
  6. Mit dem feinjustierten letzten 3.7.9 obj habe ich die Geschwindigkeit von DISQLite3 erreicht

  7. 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

    
Ivelin Nikolaev 01.01.2012, 18:58
quelle

2 Antworten

8

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 .

    
Arnaud Bouchez 01.01.2012, 19:29
quelle
4

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:

  1. Verknüpfen Sie eine andere OBJ-Datei mit der fehlenden Abhängigkeit.
  2. Implementieren Sie die fehlende Abhängigkeit in Delphi-Code in derselben Einheit, die $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.

    
David Heffernan 01.01.2012 19:06
quelle

Tags und Links