【问题标题】:Using sqlite from vala without dependence on glib在不依赖 glib 的情况下使用来自 vala 的 sqlite
【发布时间】:2010-06-14 00:12:25
【问题描述】:

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

【问题讨论】:

    标签: sqlite posix vala


    【解决方案1】:

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

    归结为声明不同的委托 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 并用你的补丁提交一个错误(太棒了,一个贡献!)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          如果 sqlite 的 vapi 依赖于 glib,您可以自己编写或使用带有 c 的 sqlite c 代码,然后为您需要的函数创建一些 extern 语句。例如,我制作了一个工具,它混合了 vala 和 c for linux pure c for win32 and objective c and c for mac https://github.com/boscowitch/wadoku-notify 我刚刚在我的 vala 应用程序的开头添加了我需要的 2 个功能,如下所示:

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

          我添加了整个 sqlite 源代码,因为我需要激活全文索引并在代码中进行一些更改,并且在 vala 的开头没有 sqlite vapi

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-11
            • 1970-01-01
            • 2014-02-24
            • 1970-01-01
            • 2017-07-18
            • 1970-01-01
            • 1970-01-01
            • 2012-10-13
            相关资源
            最近更新 更多