SQLite Library Problem



  • Hallo,
    ich bin neu hier und neu bei C++. Arbeite mit Windows XP, Eclipse und MinGW.
    Habe jedoch alte Erfahrungen mit FORTRAN (auf der VAX), Turbo Pascal und CLIPPER (auf DOS-PC). Und mit JAVA (Windows, Eclipse).
    Mein Problem, hört sich ganz einfach an, habe auch das Web schon durchkämmt und vieles ausprobiert.
    Heruntergebrochen auf ein ganz simples Beispiel:

    #include <sqlite3.h>
    int main() {
    sqlite3 *db;
    sqlite3_open("test.db", &db);
    return -1;
    }

    führt zu
    undefined reference to `sqlite3_open'
    Auch bei Aufruf aus der Kommandozeile
    > gcc CppTest02.cpp -l sqlite3
    ... cannot find -lsqlite3
    collect2.exe: error: ld returned 1 exit status

    Habe sqlite3.h und sqlite3.dll in das src-Verzeichnis kopiert. Fehler bleibt.
    Jetzt weiss ich nicht weiter, wer kann helfen?

    Danke
    Michel



  • Du benötigst zum Linken die passende Library-Datei (sqlite3.lib bzw. sqlite3.a).
    Woher hast du denn die DLL (und Headerdatei)? Die Library-Datei muß zu deinem verwendeten Compiler (gcc) passen.

    Alternativ die Sourcen ("amalgamation") unter SQLite - Download herunterladen und zusammen mit deinen Projektdateien kompilieren.



  • Th69 schrieb:

    ...
    Alternativ die Sourcen ("amalgamation") unter SQLite - Downlaod herunterladen und zusammen mit deinen Projektdateien kompilieren.

    Danke, habe ich gemacht, die -c Option war noch notwendig zur Erzeugung des Object-Files. sqlite3.c, sqlite3.h (und sqlite3-.dll) hatte ich aus dem SQLite Download-Bereich.

    > gcc -c sqlite3.c
    erzeugt sqlite3.o
    sqlite3.o und sqlite3.h beide in's Source-Verzeichnis gestellt.
    Gleiches Prozedere, exakt gleicher Fehler (Eclipse und Kommandozeile).

    Bitte nochmals um Hilfe

    Danke
    Michel



  • Kommando zurück, gerade seh ich's:
    Muß eine Library erzeugen, kein Objectfile. das kriege ich hin. Oder eine andere Linkoption für ein Objectfile. Werde ich lernen.



  • Ich gebe auf
    Habe die Library erstellt:
    gcc -c sqlite3.c // Kompilierung / Erzeugen sqlite3.o
    ar rcs sqlite3.a sqlite3.o // Erzeugen Library

    Dann mit der Library kompiliert (im lokalen Verzeichnis, dann auch in C:\MinGW\bin hineinkopiert
    Kommandozeile (mit gcc genauso wie mit g++)

    gcc CppTest02.cpp -l sqlite3.a bzw. >gcc CppTest02.cpp -l sqlite3.a
    führt zu
    c:/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../../mingw32/bin/ld.exe: cannot find -lsqlite3.a
    collect2.exe: error: ld returned 1 exit status

    Das gleiche mit Eclipse
    g++ "-LC:\\sqlite" -o CppTest02.exe "src\\CppTest02.o"
    liefert
    src\CppTest02.o: In function main': C:\\cpp\\eclipse\\workspace\\CppTest02\\Debug/../src/CppTest02.cpp:13: undefined reference tosqlite3_open'
    collect2.exe: error: ld returned 1 exit status

    Wer kann mir helfen, wo hängt's?



  • Korrektur:

    Dann mit der Library kompiliert (im lokalen Verzeichnis, dann auch in C:\MinGW\lib hineinkopiert



  • Ich kann dir auch nur msys2 ans Herz legen.
    http://www.msys2.org/

    installieren und dann ist es nur noch eine sache von

    pacman -S mingw-x86_64-sqlite3 mingw-i686-sqlite3
    

    g++ -lsqlite3



  • Um die Sourcen zu kompilieren brauchst du keine Lib erzeugen, einfach

    gcc CppTest02.cpp sqlite3.c -o CppTest02.exe
    

    Oder wenn du schon die Objektdatei erzeugt hast:

    gcc CppTest02.cpp sqlite3.o -o CppTest02.exe
    


  • Super, hat auf Anhieb geklappt, Th69, danke.

    \1: Danke ebenfalls für den Hinweis. Die MSYS2 ist jedoch nur für Windows neuer als XP geeignet gemäß MSYS2-Homepage.
    Den Nutzen habe ich auch noch nicht ganz verstanden. Ist das build besser als das von Eclipse?

    Gruß
    Michel



  • Der Vorteil ist, dass man diverse libs alle schon compiliert direkt installieren kann, als wär man auf einem linux. Ich habe schon seit ewigkeiten kein boost, sqlite, zlib, pthread, opencv, ... mehr runterladen und irgendwo hin tun müssen und ggf bauen. Es ist total angenehm.


Log in to reply