1

我需要在不依赖 GLib 的情况下使用 Sqlite vapi。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_freeGLib.DestroyNotify符号。是否有任何posix替代品?

4

4 回答 4

3

这应该很容易解决,我可以想象几种解决方案。

它归结为声明不同的委托 void DestroyNotify (void* data)(在 posix.vapi 或 sqlite3.vapi 中)并在 posix.vapi 中绑定 free()。

问题在于命名空间,您可能需要提交错误并与开发人员讨论。如果您想避免此问题并准备好解决方法,只需创建一个 mini glib.vapi GLib 命名空间,在其中仅绑定 DestroyNotify() 和 g_free()(绑定到 libc/posix free)。

我认为 sqlite3 不应该使用 GLib,而应该使用 libc/posix,所以你应该只修改 posix.vapi 和 sqlite3.vapi 并用你的补丁提交一个错误(太棒了,一个贡献者!)。

于 2010-06-16T20:57:30.963 回答
1

请注意,类在 POSIX 配置文件下不可用,因为 Vala 需要一个支持库(即 GLib、Dova)来支持这些功能。Jürg Billeter 承认对 POSIX 配置文件的支持是实验性的和有限的:

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

于 2010-11-06T00:14:10.930 回答
1

您拥有的唯一方法是重写 sqlite VAPI(或只是您需要的类/方法)使它们对 posix 友好(但我想您不能以这种方式使用类)。

于 2011-01-14T18:14:01.210 回答
0

如果 sqlite 的 vapi 依赖于 glib,您可以自己编写或使用带有 c 的 sqlite c 代码,并为您需要的函数制作一些 extern 语句。例如,我制作了一个工具,它混合了 vala 和 c for linux pure c for win32,objective c 和 c for 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

于 2011-12-19T01:13:50.160 回答