我需要在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替代品?

最佳答案

解决起来应该很简单,我可以想象出几种解决方案。

归结为在posix.vapi或sqlite3.vapi中声明一个不同的委托void DestroyNotify(无效*数据)并在posix.vapi中绑定free()。

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

我认为sqlite3不应使用GLib,而应使用libc / posix,因此可以通过只修改posix.vapi和sqlite3.vapi并在您的补丁程序中提交错误来解决问题(太棒了,有贡献!)。

关于sqlite - 在不依赖glib的情况下从vala使用sqlite,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3034425/

10-11 08:32