Использование sqlite от vala вне зависимости от glib - PullRequest
1 голос
/ 14 июня 2010

Мне нужно использовать Sqlite vapi без какой-либо зависимости от GLib. SQlite - не-gobject библиотека, поэтому это должно быть возможно сделать.

Однако, когда я пытаюсь скомпилировать следующий файл с --profile posix опция

using Sqlite;

void main() {
    stdout.printf("Hello, World!");
}

Я получаю сообщения об ошибках:

sqlite3.vapi:357.56-357.59: error: The symbol `GLib' could not be found
  public int bind_blob (int index, void* value, int n,
GLib.DestroyNotify destroy_notify);
                                                       ^^^^
sqlite3.vapi:362.68-362.71: error: The symbol `GLib' could not be found
  public int bind_text (int index, owned string value, int n = -1,
GLib.DestroyNotify destroy_notify = GLib.g_free);
                                                                   ^^^^
sqlite3.vapi:411.42-411.45: error: The symbol `GLib' could not be found
  public void result_blob (uint8[] data, GLib.DestroyNotify?
destroy_notify = GLib.g_free);
                                         ^^^^
sqlite3.vapi:420.59-420.62: error: The symbol `GLib' could not be found
  public void result_text (string value, int length = -1,
GLib.DestroyNotify? destroy_notify = GLib.g_free);
                                                          ^^^^
Compilation failed: 4 error(s), 0 warning(s)

Похоже, что некоторые функции, определенные в sqlite vapi, ссылаются на символы GLib.g_free и GLib.DestroyNotify. Есть ли какие-нибудь альтернативы posix этим?

Ответы [ 4 ]

3 голосов
/ 17 июня 2010

Это должно быть довольно просто решить, и я могу представить несколько решений.

Это сводится к объявлению другого делегата void DestroyNotify (void * data) (либо в posix.vapi или sqlite3.vapi) и bind free () в posix.vapi.

Проблема заключается в пространстве имен, и вам, возможно, придется подать ошибку и обсудить ее с разработчиками. Если вы хотите избежать этой проблемы и готовы обойти эту проблему, просто создайте мини-пространство имен glib.vapi GLib, в котором вы привязываете только DestroyNotify () и g_free () (привязка к libc / posix free).

Я бы подумал, что sqlite3 не должен использовать GLib, а скорее libc / posix, поэтому у вас все будет в порядке, изменив только posix.vapi и sqlite3.vapi и отправив сообщение об ошибке с вашим патчем (потрясающе, вклад!) 1007 *

1 голос
/ 14 января 2011

Единственный способ сделать это - переписать sqlite VAPI (или просто необходимые вам классы / методы), сделав их удобными для посксов (но я полагаю, вы не можете использовать классы таким образом).

1 голос
/ 06 ноября 2010

Обратите внимание, что классы недоступны в профиле POSIX, так как Vala требуется библиотека поддержки (например, GLib, Dova) для поддержки этих функций. Юрг Биллетер признал, что поддержка профиля POSIX является экспериментальной и ограниченной:

https://bugzilla.gnome.org/show_bug.cgi?id=618348

0 голосов
/ 19 декабря 2011

если vapi для sqlite зависит от glib, вы можете просто написать свой собственный или использовать код sqlite c с c и просто сделать несколько операторов extern для нужных вам функций.Например, я сделал инструмент, который смешивает vala и c для linux pure c для win32 и target c и c для mac https://github.com/boscowitch/wadoku-notify Я просто добавил 2 функции, которые мне нужны, в начале моего приложения vala, например так:

extern void init_db(char * path,bool mm);
extern void lookup(char * str);

я добавил весь исходный текст sqlite, потому что мне нужно было активировать полнотекстовое индексирование и немного изменить код, и в начале vala не было sqlite vapi

...