[gelöst] Datenbankzugriff SQLite - undefined reference to -

Alles rund um die Programmierung mit Qt
Antworten
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

[gelöst] Datenbankzugriff SQLite - undefined reference to -

Beitrag von pumuckl »

Hallo zusammen,

ich versuche mittels der Klassen QSQL... eine Testdatenbanken anzulegen. Beim kompilieren mit make kommt der anscheinend klassische Fehler "undefined reference to"! Hat meines Erachtens nichts mit dem in diesem Forum viel diskutierten vtable zu tun!! :wink:

main.cpp

Code: Alles auswählen

 #include <QApplication>

 //#include "connection.h"
 #include <QMessageBox>
 #include <QSqlDatabase>
 #include <QSqlError>
 #include <QSqlQuery>
 #include "tableeditor.h"

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
//     if (!createConnection())
//         return 1;
//static bool createConnection()
//{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        QMessageBox::critical(0, qApp->tr("Cannot open database"),
            qApp->tr("Unable to establish a database connection.\n"
                     "This example needs SQLite support. Please read "
                     "the Qt SQL driver documentation for information how "
                     "to build it.\n\n"
                     "Click Cancel to exit."), QMessageBox::Cancel);
    //    return false;
    }

    QSqlQuery query;
    query.exec("create table person (id int primary key, "
               "firstname varchar(20), lastname varchar(20))");
    query.exec("insert into person values(101, 'Danny', 'Young')");
    query.exec("insert into person values(102, 'Christine', 'Holand')");
    query.exec("insert into person values(103, 'Lars', 'Gordon')");
    query.exec("insert into person values(104, 'Roberto', 'Robitaille')");
    query.exec("insert into person values(105, 'Maria', 'Papadopoulos')");
    //return true;

     TableEditor editor("person");
     editor.show();
     return editor.exec();
 }
Die ganzen SQL-Codezeilen standen ursprünglich einer separaten Headerdatei "connection.h". Hier kamen aber genau die gleichen Fehlermeldungen.

tableeditor.cpp

Code: Alles auswählen

 #include <QtGui>
 #include <QtSql>

 #include "tableeditor.h"

 TableEditor::TableEditor(const QString &tableName, QWidget *parent)
     : QDialog(parent)
 {
     model = new QSqlTableModel(this);
     model->setTable(tableName);
     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
     model->select();

     model->setHeaderData(0, Qt::Horizontal, tr("ID"));
     model->setHeaderData(1, Qt::Horizontal, tr("First name"));
     model->setHeaderData(2, Qt::Horizontal, tr("Last name"));

     QTableView *view = new QTableView;
     view->setModel(model);

     submitButton = new QPushButton(tr("Submit"));
     submitButton->setDefault(true);
     revertButton = new QPushButton(tr("&Revert"));
     quitButton = new QPushButton(tr("Quit"));

     buttonBox = new QDialogButtonBox(Qt::Vertical);
     buttonBox->addButton(submitButton, QDialogButtonBox::ActionRole);
     buttonBox->addButton(revertButton, QDialogButtonBox::ActionRole);
     buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);

     connect(submitButton, SIGNAL(clicked()), this, SLOT(submit()));
     connect(revertButton, SIGNAL(clicked()), model, SLOT(revertAll()));
     connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

     QHBoxLayout *mainLayout = new QHBoxLayout;
     mainLayout->addWidget(view);
     mainLayout->addWidget(buttonBox);
     setLayout(mainLayout);

     setWindowTitle(tr("Cached Table"));
 }

 void TableEditor::submit()
 {
     model->database().transaction();
     if (model->submitAll()) {
         model->database().commit();
     } else {
         model->database().rollback();
         QMessageBox::warning(this, tr("Cached Table"),
                              tr("The database reported an error: %1")
                              .arg(model->lastError().text()));
     }
 }
tableeditor.h

Code: Alles auswählen

 #ifndef TABLEEDITOR_H
 #define TABLEEDITOR_H

 #include <QDialog>

 class QDialogButtonBox;
 class QPushButton;
 class QSqlTableModel;

 class TableEditor : public QDialog
 {
     Q_OBJECT

 public:
     TableEditor(const QString &tableName, QWidget *parent = 0);

 private slots:
     void submit();

 private:
     QPushButton *submitButton;
     QPushButton *revertButton;
     QPushButton *quitButton;
     QDialogButtonBox *buttonBox;
     QSqlTableModel *model;
 };

 #endif
Und nun noch die Fehlermeldungen:

Code: Alles auswählen

?????@linuxhost:~/Computer/progs/qt-programme/05-dbtest> qmake -project
?????@linuxhost:~/Computer/progs/qt-programme/05-dbtest> qmake
?????@linuxhost:~/Computer/progs/qt-programme/05-dbtest> make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT  -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.2.0/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include -I. -I. -I. -o main.o main.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT  -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.2.0/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include -I. -I. -I. -o tableeditor.o tableeditor.cpp
/usr/local/Trolltech/Qt-4.2.0/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.2.0/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include -I. -I. -I. tableeditor.h -o moc_tableeditor.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT  -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.2.0/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include -I. -I. -I. -o moc_tableeditor.o moc_tableeditor.cpp
g++ -Wl,-rpath,/usr/local/Trolltech/Qt-4.2.0/lib -o 05-dbtest main.o tableeditor.o moc_tableeditor.o    -L/usr/local/Trolltech/Qt-4.2.0/lib -lQtGui -L/home/Koschi/Archiv/qt-x11-opensource-src-4.2.0/lib -L/usr/X11R6/lib -lSM -lICE -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -ldl -lpthread
main.o: In function `main':
main.cpp:(.text+0x3e): undefined reference to `QSqlDatabase::defaultConnection'
main.cpp:(.text+0x79): undefined reference to `QSqlDatabase::addDatabase(QString const&, QString const&)'
main.cpp:(.text+0xce): undefined reference to `QSqlDatabase::setDatabaseName(QString const&)'
main.cpp:(.text+0xf1): undefined reference to `QSqlDatabase::open()'
main.cpp:(.text+0x19c): undefined reference to `QSqlDatabase::QSqlDatabase()'
main.cpp:(.text+0x1c3): undefined reference to `QSqlQuery::QSqlQuery(QString const&, QSqlDatabase)'
main.cpp:(.text+0x1e3): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0x209): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x247): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x285): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x2c3): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x301): undefined reference to `QSqlQuery::exec(QString const&)'
main.o:main.cpp:(.text+0x33f): more undefined references to `QSqlQuery::exec(QString const&)' follow
main.o: In function `main':
main.cpp:(.text+0x3e2): undefined reference to `QSqlQuery::~QSqlQuery()'
main.cpp:(.text+0x3ed): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0x446): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0x451): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0x487): undefined reference to `QSqlQuery::~QSqlQuery()'
tableeditor.o: In function `TableEditor::TableEditor(QString const&, QWidget*)':
tableeditor.cpp:(.text+0x3d): undefined reference to `QSqlDatabase::QSqlDatabase()'
tableeditor.cpp:(.text+0x5b): undefined reference to `QSqlTableModel::QSqlTableModel(QObject*, QSqlDatabase)'
tableeditor.cpp:(.text+0x66): undefined reference to `QSqlDatabase::~QSqlDatabase()'
tableeditor.cpp:(.text+0x6c3): undefined reference to `QSqlDatabase::~QSqlDatabase()'
tableeditor.o: In function `TableEditor::submit()':
tableeditor.cpp:(.text+0x6fa): undefined reference to `QSqlTableModel::database() const'
tableeditor.cpp:(.text+0x705): undefined reference to `QSqlDatabase::transaction()'
tableeditor.cpp:(.text+0x70d): undefined reference to `QSqlDatabase::~QSqlDatabase()'
tableeditor.cpp:(.text+0x718): undefined reference to `QSqlTableModel::submitAll()'
tableeditor.cpp:(.text+0x72e): undefined reference to `QSqlTableModel::database() const'
tableeditor.cpp:(.text+0x739): undefined reference to `QSqlDatabase::commit()'
tableeditor.cpp:(.text+0x741): undefined reference to `QSqlDatabase::~QSqlDatabase()'
tableeditor.cpp:(.text+0x75e): undefined reference to `QSqlTableModel::database() const'
tableeditor.cpp:(.text+0x769): undefined reference to `QSqlDatabase::rollback()'
tableeditor.cpp:(.text+0x774): undefined reference to `QSqlDatabase::~QSqlDatabase()'
tableeditor.cpp:(.text+0x793): undefined reference to `QSqlQueryModel::lastError() const'
tableeditor.cpp:(.text+0x7a5): undefined reference to `QSqlError::text() const'
tableeditor.cpp:(.text+0x87a): undefined reference to `QSqlError::~QSqlError()'
tableeditor.cpp:(.text+0x898): undefined reference to `QSqlError::~QSqlError()'
tableeditor.cpp:(.text+0x8d3): undefined reference to `QSqlDatabase::~QSqlDatabase()'
tableeditor.cpp:(.text+0x900): undefined reference to `QSqlError::~QSqlError()'
tableeditor.o: In function `TableEditor::TableEditor(QString const&, QWidget*)':
tableeditor.cpp:(.text+0x9ad): undefined reference to `QSqlDatabase::QSqlDatabase()'
tableeditor.cpp:(.text+0x9cb): undefined reference to `QSqlTableModel::QSqlTableModel(QObject*, QSqlDatabase)'
tableeditor.cpp:(.text+0x9d6): undefined reference to `QSqlDatabase::~QSqlDatabase()'
tableeditor.cpp:(.text+0x1033): undefined reference to `QSqlDatabase::~QSqlDatabase()'
collect2: ld returned 1 exit status
make: *** [05-dbtest] Fehler 1
?????@linuxhost:~/Computer/progs/qt-programme/05-dbtest>
Danke!
Zuletzt geändert von pumuckl am 27. November 2006 19:37, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Der Linker linked QtSql nicht, hast du im .pro-File QT+=sql angegeben?
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

Beitrag von pumuckl »

Hallo upsala,

nein, habe ich nicht, denn das pro-File wird automatisch mit qmake -project erzeugt, was bisher auch immer funktioniert hat.

Warum er das SQL nicht automatisch ins pro-File mit reinnimmt, kann ich nicht sagen!??

Auf jeden Fall hab ich deinen Hinweis umgesetzt und siehe da, es funktioniert! :D

Besten dank!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Weil qmake -project nur die Dateien sammelt, aber keine Konfigurationsoptionen zusammensucht...
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

Beitrag von pumuckl »

Wo finde ich denn mehr über Konfigurationsoptionen? Wahrscheinlich im QT-Assistant - muss ich mal schauen...
Antworten