Problem z połączeniem do zaszyfrowanej bazy SQLite

0

Witam,
Potrzebuję pomocy. Piszę prosty program w c++ do połączenia z bazą SQLite (zabezpieczonej hasłem) i mam problem przy kompilowaniu programu. Z góry mówię, że nie jestem programistą i potrzebuję wykonywać proste zapytania w bazie db zabezpieczonej hasłem. Poniżej przesyłam kod:

#include <iostream>
#include <string>
#include <sqlite3.h>
#include <stdlib.h>
#include <string.h>


int sqlite3_key(
  sqlite3 *db,                   /* Database to be rekeyed */
  const void *pKey, int nKey     /* The key, and the length of the key in bytes */
);

int sqlite3_rekey(
  sqlite3 *db,                   /* Database to be rekeyed */
  const void *pKey, int nKey     /* The new key, and the length of the key in bytes */
);

int main()
{

  sqlite3* db;
    sqlite3_open("test.db", &db);

    sqlite3_key(
        db, /* Database to be rekeyed */
        "test", 1024 /* The key, and the length of the key in bytes */
    );

return 0;
	
	
}

Podczas kompilacji w linuxie poprzez polecenie: g++ sql.cpp -lsqlite3
Wyskakuje mi błąd: /tmp/cc3geAGK.o: In function main': sql.cpp:(.text+0x1c): undefined reference to sqlite3_key(sqlite3*, void const*, int)'
collect2: error: ld returned 1 exit status

Z góry dzięki za pomoc

0

deklarację funkcji masz ale definicji brakuje?

0

Biblioteka sqlite nie znajduje się w żadnym domyślnym katalogu, w których szuka linker. Te domyślne katalogi otrzymasz wywołując:

sudo ldconfig -v 2>/dev/null | grep -v ^$'\t'

W którymś z wylistowanych katalogów musisz mieć bibliotekę. Najprościej jednak będzie jeśli ściągniesz źródła sqlite, to tylko dwa pliki a potem skompilujesz w ten sposób:

g++ sql.cpp sqlite3.c -o sqliteTest -lpthread -ldl

A jeśli chcesz koniecznie skompilować swoim sposobem, to odpal synaptic i zainstaluj paczkę libsqlite3-0, wtedy powinno działać.

0

A niby co to ma być: "test", 1024 /* The key, and the length of the key in bytes */
Podałeś hasło o długości 4 znaków a przekzujesz, że ma długość 1024. To prowadzi do Undefined Behavior i jakieś śmieci są traktowane jako część hasła.

Popraw tak:

    std::string password { "jakies tajemnicze haslo" };
    sqlite3_key(
        db, /* Database to be rekeyed */
        password.data(), password.length()
    );

A problem z błędem undefined reference wynika zapewne z tego, że biblioteka wystawia API w C a nie w C++.
Czyli trzeba dołączyć ten nagłówki jako API C:
Sprawdziłem źródła sqlite3.h i okazało się, że nagłówek już sam to robi.
Jednak wywal własne deklaracje funkcji Sql Lite bo one mogą psuć ci kod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1