2016-04-08 4 views
1

Ich versuche, ein kleines C-Programm mit SQLite3 zu kompilieren. Ich habe die Header-Datei bereits eingefügt und die .dll-Datei in eine .lib-Datei konvertiert.GCC-Kompilierfehler:/usr/bin/ld: kann -lsqlite3.lib nicht finden

Das Interessante ist, dass gcc (CodeBlocks) unter Windows den Quellcode problemlos kompilieren kann. Aber unter Debian (Raspberry Pi) Ich bekomme diese Fehlermeldung: /usr/bin/ld: nicht -lsqlite3.lib

Die sqlite3.lib Datei im selben Ordner wie die main.c Datei finden Ich möchte kompilieren. (Ich habe auch versucht, die LIB-Datei zu kopieren, zu/usr/bin/- kein Erfolg)

Und wenn ich versuche, die windows-kompilierte Programm auf meinem Himbeere laufen, erhalte ich eine andere Fehlermeldung ...

Hier ist meine Quellcode:

#include <stdio.h> 
#include <stdlib.h> 
#include "sqlite3.h" 

static int callback(void *NotUsed, int argc, char **argv, char **azColName); 

int main(void){ 

    sqlite3 *db=NULL; 
    int erg = 0; 
    char *errMsg = NULL; 

    erg = sqlite3_open("temp_values.db", &db); 

    if (erg == 1){ 
     fprintf(stderr, "Fehler beim Oeffnen der DB!\n"); 
     sqlite3_close(db); 
     return EXIT_FAILURE; 
    } 
    else fprintf(stdout, "Database connection successful!\n"); 

    erg = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS temp_values (username TEXT, port TEXT, degrees INTEGER, humidity INTEGER, PRIMARY KEY(username, port));", callback, 0, &errMsg); 

    if (erg){ 
     fprintf(stderr, "SQL error: %s\n", errMsg); 
    } 
    else fprintf(stdout, "Table check successful!\n"); 

    erg = sqlite3_exec(db, "INSERT INTO temp_values (username, port, degrees, humidity) VALUES ('root', '4', 24, 35);", callback, 0, &errMsg); 

    if (erg){ 
     fprintf(stderr, "SQL error: %s\n", errMsg); 
    } 
    else fprintf(stdout, "Inserted tuple successful!\n"); 

    sqlite3_close(db); 

    return EXIT_SUCCESS; 
} 

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; 

} 

ich hoffe jemand kann mir helfen ...

+1

Do Sie haben die sqlite-devel-Pakete installiert? Auf CentOS heißt es sqlite-devel.x86_64 –

+3

Wenn der Fehler wirklich '/ usr/bin/ld: -lsqlite3.lib nicht finden kann, vermute ich Probleme in Ihrem Makefile (linux static libs haben eine .a Erweiterung. – fvu

+0

Bitte posten Sie Ihre build rezept, makefile oder was auch immer. In der Frage, nicht die Kommentare, bitte. –

Antwort

1

Das grundlegendste Problem hier ist, dass Sie nicht eine binäre Datei (ein Programm, Objektdatei, Bibliothek) in Anspruch nehmen, dass Sie auf einem Betriebssystem aufgebaut haben (z Windows) und erwarten es funktioniert auf einem anderen Betriebssystem (z. B. Linux). Binärdateiformate unterscheiden sich zwischen den Betriebssystemen .

Windows ausführbare Dateien und Bibliotheken sind für Debian nicht erkennbar. Also, wenn Sie ein Programm, das die sqlite3 Bibliothek verwendet, die Sie auf Debian ausführen möchten, Sie müssen:

  • die Quelldateien auf Debian Kompilieren auf Linux erstellen Objektdateien.
  • Verknüpfen Sie die Objektdateien mit einer Bibliothek sqlite3, die auch für Linux erstellt wurde.

Ein zweites Problem ist, dass, selbst wenn ein Linux sqlite3 Bibliothek aufgerufen wurde sqlite3.lib (was es nicht wäre), und auch wenn sqlite3.lib im aktuellen Verzeichnis war, als Sie versuchen, das Programm zu verknüpfen, die Linker-Option -lsqlite3.lib wird den Linker nicht aktivieren, um es zu finden (wie Sie entdeckt haben).

Der offical behaviour of the GNU linker option -lfoo ist der Linker zu machen für eine Datei namens libFoo.a (eine statische Bibliothek) oder libfoo.so (eine dynamische Bibliothek) und ein bestimmtes Verzeichnis in der Bibliothek Suchpfade suchen, um bevorzugen libfoo.so, wenn es beide im selben Verzeichnis findet. Daher fragt -lsqlite3.lib den Linker, entweder libsqlite3.lib.so oder libsqlite3.lib.a zu finden, keine der , die existiert.

Unter Windows finden Sie, dass -lsqlite3.lib funktioniert.Das ist, da Windows Bibliotheken folgen nicht dem Linux-Konvention, die die foo statische Bibliothek ist libFoo.a und die foo dynamische Bibliothek ist libfoo.so. Der Windows-Port des GNU-Linkers akzeptiert Windows-Stil-Bibliotheksnamen in der -l-Option als explained here.

Unter Debian ist das Entwicklerpaket der sqlite3-Bibliothek im Paketmanager als libsqlite3-dev verfügbar. Sie können es als root installieren, mit dem Befehl:

sudo apt-get install libsqlite3-dev 

Nachdem Sie es installiert haben, können Sie Ihr Programm zusammenstellen können, sagen Sie es main.c, mit dem Befehl lautet:

gcc -Wall -c -o main.o main.c 

Link-it:

gcc -o prog main.o -lsqlite3 

Run it:

$ ./prog 
Database connection successful! 
Table check successful! 
Inserted tuple successful! 
+0

Vielen Dank! Es hat mit der Installation des libsqlite3-dev-Pakets funktioniert! Das nächste Mal, wenn ich Bibliotheken benutzen will, werde ich wissen, wie es geht (entweder .a oder .so). Du bist großartig! –

+0

@MichaelGierer Willkommen bei Stackoverflow! Wenn diese Antwort dein Problem gelöst hat, kannst du [Akzeptiere es] (http://stackoverflow.com/help/accepted-answer), indem du auf das grüne Häkchen klickst. So sagst du "Danke". –

2

Ausgabe dieses in einem Terminal

sudo apt-get install libsqlite3-dev 

und Fenster lib-Datei funktioniert nicht in Linux