Seite 1 von 1

[solved] Problem mit DLLs / SQLite

Verfasst: 23. August 2009 12:21
von mueslo
Hallo,

Erstmal vorneweg: ich benutze qt 4.5.0 mit eclipse 3.4.2 auf windows vista x64.

Nachdem ich gestern den halben Tag lang im Netz nach Lösungen gegooglet hab und nicht fündig geworden bin, poste ich nun in dieses Forum.
Mein Problem besteht darin, dass ich eine SQLite-Datenbank in mein Qt-Projekt einbinden will. Dazu hab ich mir die sqlite3.dll und sqlite3.def von SQLite heruntergeladen und daraus eine sqlite3.lib erstellt. Dann hab ich mir noch eine unkompilierte sqlite3.h besorgt, die ich dann included habe. Wie ich dann die .dll Verlinken sollte, wusste ich nicht, hab aber im Internet etwas für Eclipse gefunden. Das Problem ist nur, da ich ein Qt-C++-Projekt bei Eclipse habe, sind die Optionen ganz anders aufgebaut.

Die Anleitung habe ich gefunden:
7. Anschließend den Listenpunkt MinGW C++ Linker suchen und darunter den Unterpunkt Libraries auswählen
8. Unter Libraries (-l) das grüne Plus Zeichen für ADD auswählen und Sqlite3 ohne Endung hineinschreiben
9. Unter Library Search path (-L) das grüne Plus Zeichen für ADD auswählen
Aber wie gesagt sind die Menüs bei mir wegen Qt anders aufgebaut, und ich hab probiert etwas so ähnlich wie mögliches zu machen.
Bild
Das war aber auch der einzige Ort in den Projekteigenschaften, wo ich etwas mit .dlls/.libs machen konnte.

Code: Alles auswählen

#include <iostream>
#include <QtGui>
#include <QApplication>
#include "tea.h"
#include "sqlite3.h"

using namespace std;

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
	int i;
	for (i = 0; i < argc; i++)
	{
		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
	}
	printf("\n");
	return 0;
}

TEA::TEA(QWidget *parent) :
	QMainWindow(parent)
{
	ui.setupUi(this);
}

TEA::~TEA()
{

}

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	TEA w;
	sqlite3* Database;

	if (sqlite3_open("routes.db",
			&Database) != SQLITE_OK)
	{
		// Es ist ein Fehler aufgetreten!
		cout << "Fehler beim Öffnen: " << sqlite3_errmsg(Database) << endl;

		return a.exec();
	}

	cout << "Datenbank erfolgreich geöffnet!" << endl;

	sqlite3_close(Database);

	cout << "Datenbank geschlossen!" << endl;

	w.show();

	return a.exec();
}
[/size]

Und das produziert folgenden fehler:

Code: Alles auswählen

debug/main.o(.text+0x4c9): In function `Z5qMainiPPc':
C:/Users/jf/workspace/TEA/main.cpp:38: undefined reference to `sqlite3_open'
debug/main.o(.text+0x4dc):C:/Users/jf/workspace/TEA/main.cpp:42: undefined reference to `sqlite3_errmsg'
mingw32-make[1]: Leaving directory `C:/Users/jf/workspace/TEA'
debug/main.o(.text+0x599):C:/Users/jf/workspace/TEA/main.cpp:49: undefined reference to `sqlite3_close'
Was ja soweit ich weit bedeutet, dass nicht richtig gelinkt wird.

Was mache ich falsch bzw. was muss ich tun, damit es funktioniert?

Verfasst: 23. August 2009 12:38
von androphinx
Was hälst du denn davon, einfach mal das in Qt einbaute SQLite zu verwenden???

http://doc.trolltech.com/4.5/sql-driver ... -and-above

Mfg androphinx

Verfasst: 23. August 2009 12:39
von Christian81
sqlie3.lib ist keine Library für MinGW sondern für MSVC. Das kann nicht klappen.

Verfasst: 23. August 2009 14:16
von mueslo
Gut, ich hab jetzt das mit Qt mitgeliefert SQLite kompiliert und die entstandene .a-Datei hinzugefügt, aber ich bekomme immernoch dieselben Fehler.

Verfasst: 23. August 2009 15:44
von Christian81
mueslo hat geschrieben:Gut, ich hab jetzt das mit Qt mitgeliefert SQLite kompiliert und die entstandene .a-Datei hinzugefügt, aber ich bekomme immernoch dieselben Fehler.
?
Du sollst das QtSql-Modul verwenden - nicht sqlite direkt!

Verfasst: 23. August 2009 16:48
von mueslo
Aber benutzt QtSql nicht MySQL? oder kann man das umstellen?

Verfasst: 23. August 2009 18:40
von solarix
Aber benutzt QtSql nicht MySQL? oder kann man das umstellen?
Wenn QtSql ein Interface für MySQL wäre, hiesse es wohl eher "QMySql" .. findest du nicht auch?

So

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
nimmst du den QSQLITE-Treiber... das ist alles.. da brauchst du sonst nichts zu compilen oder speziell zu linken..

Beispiel für Anwendungen, siehe Qt-Examples wie z.B.
http://doc.trolltech.com/4.5/sql-sqlwidgetmapper.html

Verfasst: 28. August 2009 17:55
von mueslo
Hab ich gemacht, aber ich bekomme mittlerweile über dbquery.lastError() den Fehler "Driver not loaded".

Ich vermute ja dass es daran liegt:

SQLite version 3 is included as a third-party library within Qt. It can be built by passing the following parameters to the configure script: -plugin-sql-sqlite (build as a plugin) or -qt-sql-sqlite (linked directly into the Qt library).

weil ich keine Ahnung hab wo ich Parameter für den configure-script bei Eclipse übergeben kann

EDIT: Also das configure-script was ich gefunden hab ist das für qt. wenn ich das aber nach dem configuren über mingw32-make installieren will, kommt

Code: Alles auswählen

C:\Qt\4.5.2_proper>mingw32-make
cd src/winmain/ && mingw32-make -f Makefile
      0 [main] sh 29780 sync_with_child: child 39976(0x154) died before initiali
zation with status code 0x0
    362 [main] sh 29780 sync_with_child: *** child state waiting for longjmp
/usr/bin/sh: fork: Resource temporarily unavailable
mingw32-make: *** [sub-winmain-make_default-ordered] Error 128

Verfasst: 30. August 2009 17:30
von mueslo
Hat jemand eine Ahnung was das bedeutet? Denn bei Google finde ich unter den ca 10 Suchergebnissen nichts relevantes und die Fehlernachricht lässt mich auch nciht mehr über den eigentlichen Fehler erahnen.

Verfasst: 30. August 2009 17:48
von Christian81
Irgendwo ist die msys oder cygwin bash in PATH.

Verfasst: 30. August 2009 19:50
von mueslo
Danke. Ich hab MSYS nun aus PATH rausgenommen und versucht zu kompilieren. mingw32-make hört aber immer an völlig verschiedenen Stellen mit einem segmentation fault auf.

EDIT: Ich hab's einfach nochmal versucht, dann ging's. Der Fehler "Driver not loaded" ist aber immer noch da.

Verfasst: 31. August 2009 21:25
von mueslo
So, also ich bekomm es nicht zum laufen. Ich fasse nochmal zusammen was ich bis jetzt gemacht hab.

Qt Source (4.5.2) heruntergeladen und kompiliert mit -qt-sql-slite etc. Includes etc aktualisiert. Das Programm kompiliiert nun wie unter 4.5.0 was ich vorher hatte.

Hier nun mein Quelltext:

Code: Alles auswählen


#include <iostream>
#include <QtGui>
#include <QApplication>
#include <QtSql>
#include "ui_tea.h"
#include "tea.h"
#include <QSqlDatabase>

MainWin::MainWin(QWidget *parent) :
	QMainWindow(parent)
{
	ui.setupUi(this);

	{
		QSqlQuery dbquery;
		QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
		db.setDatabaseName("routesdb.db");
		if (db.open())
		{
			QSqlDatabase defaultDB = QSqlDatabase::database();
			dbquery.exec("CREATE TABLE route1 (node INTEGER, lat INTEGER, lon INTEGER)");
			dbquery.exec("INSERT INTO route1 (node, lat, lon) VALUES (0,50,30)");
			dbquery.exec("INSERT INTO route1 (node, lat, lon) VALUES (1,51,30)");
			dbquery.exec("SELECT lat, lon FROM route1 WHERE node==1");
			if (!dbquery.isActive())
			    QMessageBox::warning(this, "Database Error",
			                         dbquery.lastError().text());



			db.close();
		}
	}
	QSqlDatabase::removeDatabase("default");




}

[/size]

So, und das gibt nach wie vor "Driver not loaded" aus.
in C:\Qt\4.5.2_source\plugins\sqldrivers befindet sich libqsqlited4.a und qsqlited4.dll


Und hier was Procmon im zusammenhand mit qsqlited4.dll ausgibt

Code: Alles auswählen

23:08:30,4205918	TEA.exe	144968	QueryOpen	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	FAST IO DISALLOWED	
23:08:30,4206447	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4207008	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4207301	TEA.exe	144968	QueryFileInternalInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	IndexNumber: 0x400000005ff5c
23:08:30,4207512	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4208644	TEA.exe	144968	QueryBasicInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	CreationTime: 31.08.2009 20:58:27, LastAccessTime: 31.08.2009 20:58:27, LastWriteTime: 31.08.2009 20:58:27, ChangeTime: 31.08.2009 20:58:27, FileAttributes: A
23:08:30,4208786	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4209842	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Data/List Directory, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4210419	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4210704	TEA.exe	144968	QueryFileInternalInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	IndexNumber: 0x400000005ff5c
23:08:30,4210923	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4212155	TEA.exe	144968	CreateFileMapping	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	FILE LOCKED WITH ONLY READERS	SyncType: SyncTypeCreateSection, PageProtection: 
23:08:30,4212758	TEA.exe	144968	CreateFileMapping	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	SyncType: SyncTypeOther
23:08:30,4214229	TEA.exe	144968	Load Image	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Image Base: 0x76f0000, Image Size: 0x28e000
23:08:30,4214478	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4215495	TEA.exe	144968	QueryOpen	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	FAST IO DISALLOWED	
23:08:30,4216044	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4216608	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4216919	TEA.exe	144968	QueryFileInternalInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	IndexNumber: 0x400000005ff5c
23:08:30,4217128	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4218262	TEA.exe	144968	QueryBasicInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	CreationTime: 31.08.2009 20:58:27, LastAccessTime: 31.08.2009 20:58:27, LastWriteTime: 31.08.2009 20:58:27, ChangeTime: 31.08.2009 20:58:27, FileAttributes: A
23:08:30,4218404	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4219386	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Data/List Directory, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4219957	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4220242	TEA.exe	144968	QueryFileInternalInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	IndexNumber: 0x400000005ff5c
23:08:30,4220460	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4221652	TEA.exe	144968	CreateFileMapping	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	FILE LOCKED WITH ONLY READERS	SyncType: SyncTypeCreateSection, PageProtection: 
23:08:30,4222211	TEA.exe	144968	CreateFileMapping	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	SyncType: SyncTypeOther
23:08:30,4223459	TEA.exe	144968	Load Image	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Image Base: 0x76f0000, Image Size: 0x28e000
23:08:30,4223677	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4224593	TEA.exe	144968	QueryOpen	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	FAST IO DISALLOWED	
23:08:30,4225098	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4225810	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4226111	TEA.exe	144968	QueryFileInternalInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	IndexNumber: 0x400000005ff5c
23:08:30,4226326	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4227500	TEA.exe	144968	QueryBasicInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	CreationTime: 31.08.2009 20:58:27, LastAccessTime: 31.08.2009 20:58:27, LastWriteTime: 31.08.2009 20:58:27, ChangeTime: 31.08.2009 20:58:27, FileAttributes: A
23:08:30,4227644	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4228667	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Data/List Directory, Execute/Traverse, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4229255	TEA.exe	144968	CreateFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
23:08:30,4229565	TEA.exe	144968	QueryFileInternalInformationFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	IndexNumber: 0x400000005ff5c
23:08:30,4229787	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4231061	TEA.exe	144968	CreateFileMapping	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	FILE LOCKED WITH ONLY READERS	SyncType: SyncTypeCreateSection, PageProtection: 
23:08:30,4231764	TEA.exe	144968	CreateFileMapping	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	SyncType: SyncTypeOther
23:08:30,4232067	TEA.exe	144968	CloseFile	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	
23:08:30,4233947	TEA.exe	144968	Load Image	C:\Qt\4.5.2_source\plugins\sqldrivers\qsqlited4.dll	SUCCESS	Image Base: 0x76f0000, Image Size: 0x28e000
[/size]

Verfasst: 2. September 2009 21:34
von mueslo
Ich hab die qsqlite4d.dll mal mit Dependency Walker durchgecheckt, und es kommt heraus, dass

GPSVC.DLL und
IESHIMS.DLL

nicht aufgefunden/aufgelöst werden können.

Weiß jemand was das für Libraries sind, wieso sie bei mir fehlen und wo ich sie herkriegen kann?

EDIT: IESHIMS.DLL hab ich gefunden und zu sqldrivers kopiert, damit er sie findet, GPSVC.DLL hab ich auch, aber nur in 64-bit (Wieso liegt ne 64-bit DLL in system32??), diese kann ich folglich also nicht mit meiner 32-bit Anwendung benutzen. Kann mir jemand helfen?

Verfasst: 6. September 2009 17:55
von mueslo
QSqlQuery-Erzeugung muss nach QSqlDatabase::open()