Ошибка расширений SQLite, компиляция c в dll

#database #sqlite #ubuntu

#База данных #sqlite #ubuntu

Вопрос:

Что необходимо:

Скомпилируйте расширение json1 для SQLite

Что я сделал:

Обновлена официальная страница расширения:https://sqlite.org/loadext.html

Загружен исходный код SQLite:https://www.sqlite.org/cgi/src/doc/trunk/README.md

Найдено 2 способа компиляции dll:

  1. cl windows command
  2. gcc linux command

Для cl команды я установил Visual Studio и запустил файл vcvars32.bat для запуска среды, затем попробовал эту команду: cl ext/misc/json1.c sqlite3ext.h /link /dll . Документы:https://learn.microsoft.com/en-us/cpp/build/reference/compiler-command-line-syntax?view=vs-2019

Однако это не сработало, и я получил сообщение об ошибке: fatal error C1083: sqlite3ext.h: No such file or directory . У меня есть sqlite3ext.h файл, и я попытался переместить его, но ничего не сработало.

Затем я перешел к gcc команде:

  1. Я использовал Ubuntu wsl
  2. Обновленный Ubuntu
  3. Загруженный исходный код (описанный выше)
  4. Установлен пакет разработчика SQLite (не могу его найти)
  5. Использовал эту команду: gcc -g -shared sqlite/ext/misc/json1.c -o json1.dll

Нашел команду на странице расширения SQLite, указанной выше

It didn't work and I got this long error message:

 sqlite/ext/misc/json1.c: In function ‘jsonEachConnect’:
sqlite/ext/misc/json1.c:2099:29: error: ‘SQLITE_VTAB_INNOCUOUS’ undeclared (first use in this function); did you mean ‘SQLITE_STATIC’?
     sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
                             ^~~~~~~~~~~~~~~~~~~~~
                             SQLITE_STATIC
sqlite/ext/misc/json1.c:2099:29: note: each undeclared identifier is reported only once for each function it appears in
sqlite/ext/misc/json1.c: At top level:
sqlite/ext/misc/json1.c:2501:3: warning: excess elements in struct initializer
   0                          /* xShadowName */
   ^
sqlite/ext/misc/json1.c:2501:3: note: (near initialization for ‘jsonEachModule’)
sqlite/ext/misc/json1.c:2529:3: warning: excess elements in struct initializer
   0                          /* xShadowName */
   ^
sqlite/ext/misc/json1.c:2529:3: note: (near initialization for ‘jsonTreeModule’)
sqlite/ext/misc/json1.c: In function ‘sqlite3Json1Init’:
sqlite/ext/misc/json1.c:2594:8: error: ‘SQLITE_INNOCUOUS’ undeclared (first use in this function); did you mean ‘SQLITE_IGNORE’?
        SQLITE_INNOCUOUS;
        ^~~~~~~~~~~~~~~~
        SQLITE_IGNORE
sqlite/ext/misc/json1.c:2602:10: warning: implicit declaration of function ‘sqlite3_create_window_function’; did you mean ‘sqlite3_create_function’? [-Wimplicit-function-declaration]
     rc = sqlite3_create_window_function(db, aAgg[i].zName, aAgg[i].nArg,
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          sqlite3_create_function
sqlite/ext/misc/json1.c:2603:34: error: ‘SQLITE_SUBTYPE’ undeclared (first use in this function); did you mean ‘SQLITE_CANTOPEN’?
                                  SQLITE_SUBTYPE | enc, 0,
                                  ^~~~~~~~~~~~~~
  

БУДЕМ ПРИЗНАТЕЛЬНЫ ЗА ЛЮБУЮ ПОМОЩЬ!

Спасибо!

Ответ №1:

У меня была эта проблема с расширением UUID SQLite с использованием «better-sqlite», но это что-то другое. Что я сделал, так это заменил все, что говорило SQLITE_INNOCUOUS и SQLITE_DETERMINISTIC на SQLITE_IGNORE . И это сработало, по крайней мере, для этого расширения. Что-то вроде следующего:

Перед:

 {
  int rc = SQLITE_OK;
  SQLITE_EXTENSION_INIT2(pApi);
  (void)pzErrMsg;  /* Unused parameter */
  rc = sqlite3_create_function(db, "uuid", 0, SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
                               sqlite3UuidFunc, 0, 0);
  if( rc==SQLITE_OK ){
    rc = sqlite3_create_function(db, "uuid_str", 1, 
                       SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
                       0, sqlite3UuidStrFunc, 0, 0);
  }
  if( rc==SQLITE_OK ){
    rc = sqlite3_create_function(db, "uuid_blob", 1,
                       SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
                       0, sqlite3UuidBlobFunc, 0, 0);
  }
  return rc;
}
  

После:

 {
  int rc = SQLITE_OK;
  SQLITE_EXTENSION_INIT2(pApi);
  (void)pzErrMsg; /* Unused parameter */
  rc = sqlite3_create_function(db, "uuid", 0, SQLITE_UTF8 | SQLITE_IGNORE, 0,
                               sqlite3UuidFunc, 0, 0);
  if (rc == SQLITE_OK)
  {
    rc = sqlite3_create_function(db, "uuid_str", 1,
                                 SQLITE_UTF8 | SQLITE_IGNORE | SQLITE_IGNORE,
                                 0, sqlite3UuidStrFunc, 0, 0);
  }
  if (rc == SQLITE_OK)
  {
    rc = sqlite3_create_function(db, "uuid_blob", 1,
                                 SQLITE_UTF8 | SQLITE_IGNORE | SQLITE_IGNORE,
                                 0, sqlite3UuidBlobFunc, 0, 0);
  }
  return rc;
}
  

Редактировать


Мне просто нужно было объявить это в начале кода.

 #define SQLITE_DETERMINISTIC    0x000000800
#define SQLITE_DIRECTONLY       0x000080000
#define SQLITE_SUBTYPE          0x000100000
#define SQLITE_INNOCUOUS        0x000200000